Manakah yang lebih efisien untuk kumpulan file yang sangat besar dan harus digunakan?
find . -exec cmd {} +
atau
find . | xargs cmd
(Asumsikan bahwa tidak ada karakter lucu di nama file)
linux
unix
command-line
find
dogbane
sumber
sumber
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:
atau
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.sumber
exec
akan menampilkan hasil seperti yang ditemukan, sedangkanxargs
tampaknya, menunggu sampai seluruh direktori dicari sebelum menulis ke stdout. Jika Anda mencoba ini pada direktori besar, dan tampaknya ituxargs
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.lebih efisien (berjalan
cmd
sesedikit mungkin, tidak sepertiexec
, yang berjalancmd
sekali untuk setiap pertandingan). Namun, Anda akan mengalami masalah jika nama file mengandung spasi atau karakter yang funky.Berikut ini disarankan untuk digunakan:
ini akan bekerja bahkan jika nama file berisi karakter funky (
-print0
merekfind
mencetak pertandingan NUL-dihentikan,-0
merekxargs
berharap format ini.)sumber
xargs
pendekatan ini sebenarnya jauh lebih lambat jika tidak ada (atau hanya beberapa) file yang cocok dancmd
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 ...)xargs
Versi modern sering kali mendukung eksekusi pipeline paralel.Jelas ini mungkin menjadi titik pivot dalam hal pilihan antara
find … -exec
dan… | xargs
sumber