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.