xargs standart girişini alır ve komut satırı argümanlarına dönüştürür.
find . -name '*.c' | xargs grep 'stdlib.h' çok benzer
grep 'stdlib.h' $(find . -name '*.c') # UNSAFE, DON'T USE
Ayrıca, dosya listesi tek bir komut satırı için çok uzun olmadığı sürece aynı sonuçları verecektir. (Linux, tek bir komut satırında megabayt metinleri destekler, bu nedenle genellikle xargs gerekmez.)
Ancak bunların ikisi de emilir, çünkü dosya adlarınız boşluk içeriyorsa kırılırlar . Bunun yerine, find -print0 | xargs -0çalışır, ancak çalışır
find . -name '*.c' -exec grep 'stdlib.h' {} +
Bu hiçbir zaman dosya adlarını hiçbir yerde findyayınlamıyor : onları büyük bir komut satırına ayırıyor ve grepdoğrudan çalışıyor .
\;Bunun yerine +, daha yavaş olan her dosya için ayrı ayrı grep çalışır. Yapma bunu. Ancak +bir GNU uzantısıdır, bu yüzden xargsGNU’nun bulduklarını varsayamazsanız, bunu verimli bir şekilde yapmanız gerekir .
Eğer bırakırsanız xargs, find | grepo dosya adları listesine karşı desen eşleştirme yapar findbaskılar.
Yani bu noktada, siz de yapabilirsiniz find -name stdlib.h. Tabii ki, ile -name '*.c' -name stdlib.h, herhangi bir çıktı elde edemezsiniz, çünkü bu kalıplar hem eşleşemez, hem de bulgunun varsayılan davranışı AND ile birliktedir.
Yedek lesssürecinde herhangi bir noktada boru hattının herhangi bir kısmı ne ürettiği görmek için.
Daha fazla okuma: http://mywiki.wooledge.org/BashFAQ harika şeyler içeriyor.