Bir dizindeki belirli dosyaları özyinelemeli olarak nasıl grep edebilirim?


14

Linux ve grep'te yeniyim ve yolumu bulmaya çalışıyorum.

Kullanarak find -name *.javabelirli bir dizindeki tüm java dosyalarının adlarını bulabiliyorum. fooBu dosyalarda kaç kez meydana geldiğini saymak istediğimi varsayalım , bunu nasıl yaparım?

Belki şöyle şeyler deniyorum:

grep -r "foo" *.java

ve aşağıdaki gibi yanıtlar alma:

grep:  *.java:  No such file or directory

Herhangi bir fikir?



1
Üzgünüm, bir dahaki sefere daha sert görüneceğim. Sorular çok benzerdi.
Eric Wilson

1
3512 unvanı çok daha iyi olabilir. "Temel grep kullanım sorusu" gerçek soru hakkında size çok şey anlatmaz. Bu sorun çözülmedikçe muhtemelen daha fazla tekrar edeceğiz.
Richard Hoskins

1
@richardhoskins, sabit.
John T

Yanıtlar:


16
find . -name '*.java' | xargs grep <your pattern here>

5
Daha da iyisi, içinde boşluk bulunan bir dosya adının iki dosya adına bölünmemesi için null sonlandırılmış öğeleri kullanın: find. -adı '* .java' -tipi f -print0 | xargs -0 grep <desen burada>
CoverosGene

1
@CoverosGene: Bunu işlemek için xargs --replace seçeneğini kullanabilirsiniz - şöyle: ... | xargs --replace grep "{}" <desen>
arathorn

çok teşekkürler, ne yapan bir komut olması gerektiğini biliyordum xargs.
Eric Wilson

6

Bu tür ihtiyaçlar için özel olarak tasarlanmış bir araç vardır: ack .

ack, heterojen kaynak koduna sahip büyük ağaçları olan programcılara yönelik grep gibi bir araçtır

Ayrıca "grep yerine ack kullanmanın en iyi 10 nedeni" ni okuyun . En ack sayfa.


1
Meh. Gerçek bir unix aracı, abtg [ABTG'nin Grep'ten Daha İyi] gibi bir şey mirasını ifade eden özyinelemeli bir isme ihtiyaç duyar. ACK? Bu konuda sadece iyi düşünmek geliştirilmiş NACK yazar zaten bir isim var;)
Mikeage

Gerçekten ack seviyorum nedenlerinden biri dosya türlerini belirtebilirsiniz olmasıdır. Örneğin, "ack --html <pattern>" ile birlikte tüm .html, .htm, .xhtml, .dhtml vb. Dosyalarımı tek seferde arar.
Mark van Lent

Ack benim için grep'in yerini aldı.
Ryan

3

Ne dersin:

grep -irn --include="*\.java" somePhrase *

0

bulmak. tipi f-adı '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l


3
SuperUser'a hoş geldiniz! Daha güncel sorulara (bu soru 2009'dan itibaren) ve yanıtınızın neden kabul edilmiş olandan daha iyi olduğunu açıkladığınızda cevaplarınızın daha fazla dikkat çektiğini göreceksiniz.
Eric Wilson
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.