Jawaban:
Perbedaan kecepatan tidak akan signifikan.
Tetapi Anda harus memastikan bahwa:
Skrip Anda tidak akan menganggap bahwa tidak ada file yang memiliki spasi, tab, dll dalam nama file; versi pertama aman, yang kedua tidak.
Skrip Anda tidak akan memperlakukan file yang dimulai dengan " -
" sebagai opsi.
Jadi kode Anda akan terlihat seperti ini:
find . -exec cmd -option1 -option2 -- {} +
atau
find . -print0 | xargs -0 cmd -option1 -option2 --
Versi pertama lebih pendek dan lebih mudah untuk ditulis karena Anda dapat mengabaikan 1, tetapi versi kedua lebih portabel dan aman, karena " -exec cmd {} +
" adalah opsi yang relatif baru di GNU findutils (sejak 2005, banyak sistem yang sedang berjalan belum memilikinya) dan itu buggy baru-baru ini . Juga banyak orang tidak mengetahui " -exec cmd {} +
" ini, seperti yang Anda lihat dari jawaban lain.
exec
akan menampilkan hasil seperti yang ditemukan, sedangkan xargs
tampaknya, menunggu sampai seluruh direktori dicari sebelum menulis ke stdout. Jika Anda mencoba ini pada direktori besar, dan tampaknya itu xargs
tidak berhasil, kesabaran disarankan.
-print0
find mengembalikan nama file yang dipisahkan dengan baris baru, tetapi baris baru juga bisa menjadi bagian dari nama file, membuatnya ambigu. Byte 0 tidak bisa, jadi ini adalah pemisah yang aman. Ya - menambahkan --
ke perintah yang mendukungnya adalah praktik yang baik ketika Anda tidak dapat mengontrol argumennya, meskipun tidak selalu diperlukan atau tidak aman.
find . | xargs cmd
lebih efisien (berjalan cmd
sesedikit mungkin, tidak seperti exec
, yang berjalan cmd
sekali untuk setiap pertandingan). Namun, Anda akan mengalami masalah jika nama file mengandung spasi atau karakter yang funky.
Berikut ini disarankan untuk digunakan:
find . -print0 | xargs -0 cmd
ini akan bekerja bahkan jika nama file berisi karakter funky ( -print0
merek find
mencetak pertandingan NUL-dihentikan, -0
merek xargs
berharap format ini.)
xargs
pendekatan ini sebenarnya jauh lebih lambat jika tidak ada (atau hanya beberapa) file yang cocok dan cmd
tidak banyak yang harus dilakukan untuk setiap file. Misalnya, ketika dijalankan di direktori kosong, xargs
versi akan memakan waktu setidaknya dua kali lipat, karena dua proses harus dimulai, bukan hanya satu. (Ya, perbedaannya biasanya tidak terlihat di * nix, tetapi dalam satu lingkaran itu mungkin penting; atau, coba di Windows beberapa saat ...)