Saya memanipulasi sejumlah besar file XML yang tersebar di seluruh struktur direktori bersarang.
Saya mencoba yang berikut ini:
$ find . -name "*.xml" -type f | xargs -- xmllint --format
Masalahnya adalah menghasilkan output XML yang diformat di layar, tetapi tidak mengubah file.
Bagaimana saya bisa mengubah perintah ini sehingga isi file yang sebenarnya berubah?
Jawaban yang Diterima:
Ini dapat dilakukan dari find
langsung menggunakan -exec
:
find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;
Apa yang diteruskan ke -exec
akan dipanggil sekali per file yang ditemukan dengan parameter template {}
diganti dengan nama file saat ini. \;
di akhir perintah find baru saja mengakhiri baris.
Penggunaan xargs
tidak benar-benar diperlukan dalam kasus ini karena kita perlu memanggil xmllint
sekali per file karena nama file input dan output harus ditentukan dalam panggilan yang sama.
xargs
akan diperlukan jika perintah yang disalurkan dari find bekerja pada banyak file sekaligus dan daftar itu panjang. Anda tidak dapat melakukannya dalam kasus ini, karena Anda harus meneruskan satu nama file ke --output
pilihan xmllint
. Tanpa xargs
Anda bisa berakhir dengan kesalahan "Daftar Argumen terlalu panjang" jika Anda memproses banyak file. xargs
juga mendukung string ganti file dengan -I
pilihan:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
Akan melakukan hal yang sama seperti find -exec
perintah di atas. Jika salah satu folder Anda memiliki karakter aneh di spasi yang sama, Anda harus menggunakan -0
opsi find
dan xargs
. Tetapi menggunakan xargs
dengan -I
menyiratkan opsi -L 1
yang berarti hanya memproses 1 file pada satu waktu, jadi Anda juga dapat langsung menggunakan find
dengan -exec
.