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 .
execsonuç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 xargsişe yaramıyor gibi görünüyorsa sabırlı olmanız önerilir.
-print0find, 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 cmdaksine 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 ( -print0markaları find, boş karakter sonlandırmalı maçları yazdırmak -0markaları xargsbu formatı bekliyoruz.)
xargsEşleşen dosya yoksa (veya birkaç tane) ve cmdher 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 xargsiş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 ...)