Yanıtlar:
Hız farkı önemsiz olacaktır.
Ancak şunlardan emin olmalısınız:
Komut dosyanız hiçbir dosyanın dosya adında boşluk, sekme vb. İçermeyeceğini varsaymaz; ilk versiyon güvenli, ikincisi güvenli değil.
Komut dosyanız, " -
" ile başlayan bir dosyayı seçenek olarak ele almaz .
Yani kodunuz şöyle görünmelidir:
find . -exec cmd -option1 -option2 -- {} +
veya
find . -print0 | xargs -0 cmd -option1 -option2 --
1'i görmezden gelebileceğiniz için ilk sürüm daha kısadır ve yazması daha kolaydır, ancak ikinci sürüm daha taşınabilir ve güvenlidir, çünkü " -exec cmd {} +
" GNU findutils'te nispeten yeni bir seçenektir (2005'ten beri, birçok çalışan sistem henüz buna sahip olmayacaktır) ve son zamanlarda hatalıydı . -exec cmd {} +
Diğer yanıtlardan da görebileceğiniz gibi, birçok kişi bunu " " bilmiyor .
exec
sonuçları buldukça xargs
çıkaracak, öyle görünüyor ki, stdout'a yazmadan önce tüm dizinin aranmasını bekleyecek. Bunu büyük bir dizinde deniyorsanız ve bu xargs
işe yaramıyor gibi görünüyorsa sabırlı olmanız önerilir.
-print0
find, satırsonu ile ayrılmış dosya adlarını döndürür, ancak satırsonu bir dosya adının parçası olabilir ve bu da onu belirsiz hale getirir. Bayt 0 olamaz, bu nedenle güvenli bir ayırıcıdır. Evet - --
bunu destekleyen bir komuta eklemek , her zaman kesinlikle gerekli olmasa veya güvensiz olsa bile, argümanlarını kontrol edemediğinizde iyi bir uygulamadır.
find . | xargs cmd
daha verimlidir ( her maç için bir kez çalıştırılanın cmd
aksine exec
, mümkün olduğunca az çalışır cmd
). Ancak, dosya adları boşluklar veya ilginç karakterler içeriyorsa sorun yaşarsınız.
Aşağıdakilerin kullanılması önerilmektedir:
find . -print0 | xargs -0 cmd
Bu dosya adları korkak karakterler içeren bile çalışacak ( -print0
markaları find
, boş karakter sonlandırmalı maçları yazdırmak -0
markaları xargs
bu formatı bekliyoruz.)
xargs
Eşleşen dosya yoksa (veya birkaç tane) ve cmd
her dosya için yapacak çok şeyi yoksa , yaklaşımın aslında önemli ölçüde daha yavaş olduğunu unutmayın . Örneğin, boş bir dizinde çalıştırıldığında, tek bir xargs
işlem yerine iki işlemin başlatılması gerektiğinden sürüm en az iki kat daha fazla zaman alacaktır. (Evet, fark genellikle * nix'te algılanamaz, ancak bir döngüde önemli olabilir; veya bir süre Windows'ta deneyin ...)