Tampaknya ada sejumlah cara untuk melakukan ini termasuk loop di skrip shell, find dan xargs. Yang mana yang terbaik, dan mana yang paling portabel?
Tampaknya ada sejumlah cara untuk melakukan ini termasuk loop di skrip shell, find dan xargs. Yang mana yang terbaik, dan mana yang paling portabel?
Jawaban:
find . -exec <command> {} \;
untuk direktori saat ini sebagai root dari pohon atau secara umum:
find <directory> -exec <command> {} \;
-name "*.c"
atau misalnya -type d
untuk direktori ...
find ... | xargs ...
idiom, itu memproses file dalam batch, dan ini biasanya akan lebih cepat (lebih sedikit proses diluncurkan).
Gunakan -print0
opsi untuk menemukan dan -0
opsi untuk xargs
jika Anda memiliki nama file atau direktori dengan spasi:
find {dir} -print0 | xargs -0r {command}
The -print0
pilihan untuk menemukan print nama file sebagai NUL
-separated daripada spasi daftar dipisahkan, sedangkan -0
pilihan untuk xargs
menginstruksikan untuk istirahat masukan pada NUL
daripada spasi. Karena NUL
adalah salah satu karakter yang tidak diperbolehkan dalam nama file Unix, tidak ada cara untuk itu dikira sebagai bagian dari nama file.
The -r
pilihan adalah ada sehingga xargs
tidak akan memberikan Anda sebuah kesalahan jika tidak memiliki masukan.
Jika portabilitas adalah masalah saya akan tinggal jauh dari cara-cara khusus untuk melakukannya (ada banyak orang menggunakan banyak shell yang berbeda, tetapi secara umum menemukan dan xargs adalah alat yang benar-benar dasar yang tidak ada yang berani berubah secara radikal) .
Menggunakan argumen dasar find dan xargs akan memberi Anda solusi yang lebih portabel.
Jika pengelompokan argumen bersama dapat diterima, temukan | xargs mungkin akan memberikan kinerja yang lebih baik, karena ia akan mengeksekusi perintah jauh lebih sedikit daripada menemukan -exec. Jika Anda ingin mengeksekusi perintah setiap kali untuk setiap file atau mengeksekusi di subdirektori file Anda mungkin harus menggunakan find -exec atau -execdir.
Sebagai aturan, lebih baik untuk menghindari loop khusus shell; find & xargs cukup untuk sebagian besar skenario.
Pastikan versi perintah yang Anda gunakan belum memiliki flag untuk operasi rekursif. :)