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 find
yayınlamıyor : onları büyük bir komut satırına ayırıyor ve grep
doğ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 xargs
GNU’nun bulduklarını varsayamazsanız, bunu verimli bir şekilde yapmanız gerekir .
Eğer bırakırsanız xargs
, find | grep
o dosya adları listesine karşı desen eşleştirme yapar find
baskı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 less
sü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.