Yanıtlar:
Peki, stdout'a yazan herhangi bir komutla çalışan genel durum xargs
, komutun sonuna herhangi bir sayıda komut satırı argümanı eklemenize izin verecek olan kullanmaktır :
$ find … | xargs grep 'search'
Veya komutu grep
satırınıza backticks ile yerleştirmek veya $()
komutunu çalıştıracak ve çıktısının yerini alacak:
$ grep 'search' $(find …)
Dosya adları boşluk, ya da diğer bazı “tuhaf karakterler” içeriyorsa, bu komutları (çalışmaz unutmayın \'"
, Xargs için \[*?
için $(find …)
).
Ancak, find
belirli argümanlar üzerinde bir program yürütme özelliği söz konusu olduğunda , yerleşiktir:
$ find … -exec grep 'search' {} \;
Her şey arasında -exec
ve ;
yürütmek için komuttur; {}
tarafından bulunan dosya adı ile değiştirilir find
. Bu grep
her dosya için ayrı bir işlem yürütecektir ; çünkü grep
birçok dosya alıp hepsini arayabilir, değiştirebileceğiniz ;
için +
tüm eşleştirme dosya geçmek bulmak söylemek grep
seferde:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
. QED. -exec +
Çok verimli olsa da, bulmanın tüm sürümlerinde mevcut değil.
$ find … -exec grep 'search' {} \+
şeklidir çok hızlı.
Bazı sürümlerinde grep
(örneğin gömülü olmayan Linux veya BSD veya Mac OS X'te) -r
yinelemeli bir arama yapma seçeneği vardır. OpenBSD'de, kullanın -R
(ve --exclude
aşağıdaki örnekte olduğu gibi yoktur ). Bu basit kombinasyonlarını kapsamaktadır find
ile grep
.
Uygulamanızın -R
bayrağı bayrakta değilse veya meraklısı dosya eşleştirme ölçütlerini istiyorsanız, yürütmek için -exec
birincil olanını kullanabilirsiniz . Daha eski birkaç uygulama desteklemiyor … ; Bu sistemlerde, yerine bir kullanın (bu dosya başına bir kez arayacak , bu yüzden daha yavaş olacak, ancak sonuç aynı olacaktır). Not neden hile (bir var GNU grep ve FreeBSD / NetBSD / OSX grep tek bir dosya üzerinde çağrılacak bir sorun olsa bile dosya adını göstermek için aynı etkiyi elde etmek için seçenek).find
grep
find
-exec
+
;
+
grep
/dev/null
grep
-H
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
GNU grep
-H
her zaman dosya adını yazdırma seçeneği vardır .