Belirli bir dize için bir dizindeki tüm .java dosyalarını grep


12

Tüm .java dosyalarını geçerli dizindeki basit bir dize (regex değil) ve Mac OS X'deki tüm alt dizinleri nasıl arayabilirim? Sadece eşleşen dosya ve dizin adlarının bir listesini yazdırmak istiyorum.


Bunu sorduğun için teşekkürler, bu yüzden zorunda kalmam. Şimdi sadece ".git" i nasıl hariç tutacağımı bulmak zorundayım ve birazdan işim bitti.
Dan Rosenstark

Bence js'nin cevabı daha özlü, hala yazman gerek - berbat, ama yine de berbat. Muhtemelen bunu gizlemek için bir takma ad yazabilir
Craig Tataryn

Yanıtlar:


19

Ve her zaman popüler

find . -name '*.java' | xargs grep -l 'string'

EDIT (Frank Szczerba tarafından):

İçinde boşluk olan dosya adları veya dizinlerle uğraşıyorsanız, bunu yapmanın en güvenli yolu:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Bunu yapmanın her zaman birden fazla yolu vardır.



11

Geleneksel UNIX yanıtı bu soru için kabul edilen cevap olacaktır:

find . -name '*.java' | xargs grep -l 'string'

Bu muhtemelen Java dosyaları için çalışacaktır, ancak dosya adlarındaki boşluklar Mac'te geleneksel UNIX dünyasından çok daha yaygındır. Boşluklu dosya adları yukarıdaki kanaldan geçirildiğinde, xargs tek tek kelimeleri farklı adlar olarak yorumlar.

Gerçekten istediğiniz, sınırları kesinleştirmek için isimleri geçersiz kılmaktır:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Alternatif, Mark'ın belirttiği gibi, sizin için çalışma grep'i bulmanıza izin vermektir, ancak çok sayıda dosya arıyorsanız bu yaklaşım daha yavaştır (grep, dosya listesinin tamamı ile bir kez değil, dosya başına bir kez çağrıldığı için).


Ayrıca boşlukları olan dosya adları ile başa çıkmak için xargs içinde "--replace" seçeneğini kullanabilirsiniz: ... | xargs --replace grep 'string' '{}' ({} dosya adı ile değiştirilecek)
arathorn

1
Modern buluntu sürümleri (OS X'te yüklü olanları da içerir), "-exec <komut> {} +" yı destekler; burada sondaki artı işareti (\ yerine), {} yerine "olabildiğince çok yol adını bulmayı söyler ... Bu xargs (1) "ile benzerdir (man sayfasından).
Doug Harris

7

Grep'ten daha iyi olan grep'i kullanın, ack :

ack -l --java  "string" 

3
ack varsayılan olarak Mac OS X'te yüklü değildir.
John Topley

"Varsayılan olarak" ne demek bilmiyorum. Birçok işletim sisteminde, ne yüklediğinizi seçersiniz, böylece her zaman mevcut olan programları bulmak zordur. Bir zamanlar, bir C derleyicisi her zaman oradaydı ve Perl nadirdi ...
bortzmeyer

1
Bu, standart işletim sistemi kurulumunun bir parçası olduğu anlamına gelir. Mac bilgisayarımda geliştirici araçları yüklü ve ack yüklemiyorlar. Bunu kendiniz yüklemelisiniz. Eğer varsa, o zaman güzel bir sözdizimi.
John Topley

Ack durumunda, modül bağımlılığı olmayan tek bir Perl programıdır. ~ / Bin dizininize programları "yükleyebiliyorsanız" ack'i kolayca "yükleyebilirsiniz".
Andy Lester

4

Bu aslında isterseniz bir normal ifade kullanır, sadece meta karakterlerden uzak durun veya onlardan kaçın ve dizeleri arayabilirsiniz.

find . -iname "*.java" -exec egrep -il "search string" {} \;


3
grep -rl --include="*.java" simplestring *

1
Bu en iyi cevap gibi görünüyor - eğer grep hepsini yapıyorsa, neden find & xargs kullanıyorsunuz?
Peter Gibson

FYI, soruda sorulan soru, bu komutta küçük "l" büyük değil "L" olmalıdır
Craig Tataryn

Craig haklı, cevabımı düzelttim.
js.

1

Bu bir OSX sorusu olduğundan, burada daha OSX'e özel bir cevap var.

Atlayın findve Spotlightkomut satırından kullanın . Çok daha güçlü!

COMMAND LINE SPOTLIGHT - BULMAK BÜYÜK BULUŞU

Çoğu kişi, komut satırından Spotlight aramaları yapabileceğinizi bilmez. Neden tüm gizli bulma ve grep seçeneklerini ve Spotlight'ın işi sizin için yapmasına izin verdiğinizde neyi hatırlayamıyorsunuz? Spot Işığı komut satırı arabirimine mdfind denir. GUI Spotlight aramasıyla aynı güce ve daha fazlasına sahiptir, çünkü komut satırında yazılabilir!


0

Bunu bir deneyin:

grep -rl "string" */*java

1
Bu, Mac OS X'te "grep: * / * java: Böyle bir dosya veya dizin yok" verir.
John Topley

Buradaki sorun, yalnızca * .java dosyalarını bir düzey derinlikte bulabilmesidir. Mark Thalman'ın IMHO'ya verdiği cevabı doğru şekilde görün.
Ludwig Weinzierl

Üzgünüm, Mac bilgisayarımda değil. Grep'in Mac sürümünde -r (özyinelemeli) bayrağı yok mu?
dwj

Bu, ama dosyalarda olduğunu bildiğim bir dize ararken aldığım çıktı oldu.
John Topley

0

Seçeneklerin arabirimde olduğu yerde daha sezgisel bir arama yapmak için TextWrangler gibi bir GUI programı da kullanabilirsiniz .


0
grep "(your string)" -rl $(find ./ -name "*.java")

Büyük / küçük harf kullanımını yoksaymak istiyorsanız, -rl yerine -irl yazın. (dizeniz) gereksinimi görürseniz normal ifade de olabilir.

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.