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 .