Grep'e bir dosya listesini nasıl iletirim?


98

Kullanmak findistediğim dosyaların listesini alıyorum ve alıyorum grep. Bu listeyi nasıl yayınlarım grep?

Yanıtlar:


116

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 grepsatı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, findbelirli 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 -execve ;yürütmek için komuttur; {}tarafından bulunan dosya adı ile değiştirilir find. Bu grepher dosya için ayrı bir işlem yürütecektir ; çünkü grepbirçok dosya alıp hepsini arayabilir, değiştirebileceğiniz ;için +tüm eşleştirme dosya geçmek bulmak söylemek grepseferde:

$ find … -exec grep 'search' {} \+

1
İlk iki formun boşluk içeren dosya isimleri ile çalışmadığını not etmek gerekir.
enzotib

1
Ben tercih 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.
Arcege

Ne yazık ki seni 3 kez kontrol edemiyorum.
Arcabard

3
Ben -execyerine, kullanmanızı öneririm xargs. Eğer kullanırsanız -execin find, bu sadece bir kabuk oluşturur grep içerik. Eğer kullanırsanız, xargsiki kabuk yaratacaktır: biri finddiğeri diğeri için xargs.

2
deneyle bunu bulmak $ find … -exec grep 'search' {} \+şeklidir çok hızlı.
gogoud

9

Bazı sürümlerinde grep(örneğin gömülü olmayan Linux veya BSD veya Mac OS X'te) -ryinelemeli bir arama yapma seçeneği vardır. OpenBSD'de, kullanın -R(ve --excludeaşağıdaki örnekte olduğu gibi yoktur ). Bu basit kombinasyonlarını kapsamaktadır findile grep.

Uygulamanızın -Rbayrağı bayrakta değilse veya meraklısı dosya eşleştirme ölçütlerini istiyorsanız, yürütmek için -execbirincil 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).findgrepfind-exec+;+grep/dev/nullgrep-H

find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .

2
GNU grep-Hher zaman dosya adını yazdırma seçeneği vardır .
enzotib
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.