Tek bir yerleşik komutla alt dizinlerdeki dosyalarda bir alt dize mi arıyorsunuz?


10

Windows'da, tüm alt dizinlerdeki tüm dosyalar arasında bir dize bulmak istersem,

findstr /C:"the string" /S *.h

Ancak, Linux (diyelim ki, Ubuntu) I başka hiçbir karıştığı bazı borulu komutla daha yolunu bulmuş find, xargsve grep(: bir örnek bu sayfada yer almaktadır ? Ben yinelemeli alt dizinleri ile grep nasıl ). Ancak sorum farklı: bu sihirbazla çalışan tek bir yerleşik komut var mı, kabuk betiğimi yazmak zorunda kalmadan?

Yanıtlar:


19

GNU grep, alt dizinler arasında yinelemeli olarak aramaya izin verir:

grep -r --include='*.h' 'the string' .

Ben Ubuntu bu komut satırı denedim ama "grep: geçersiz seçenek - 'M'" olsun her yerde herhangi bir 'M' göremiyorum ... şaşırtıcı
Guido Domenici

@Guido Burada iyi çalışıyor
phunehehe

Bir de önerilen düzenleme TomasG son değişen önerir *için '*': "Son joker aktaran önlemek hatalarına gerektiğinde bazı dosya başlar -"
Michael Mrozek

Garip bir olayda, orijinal cevapta girildiği gibi şimdi de benim için çalışıyor. Teşekkürler!
Guido Domenici

1
@Guido: Sorununuz geçerli dizindeki bir dosyaya -Msomethingveya bir GREP_OPTIONSayara bağlı olabilir.
Gilles 'SO- kötü olmayı bırak'

2

grep -r searchpattern /path/to/start/in

Geçerli dizin için /path/to/start/in/yalnızca " ." nerede olabilir ?



0

herhangi orada tek yerleşik komutu bu büyü sayesinde o işleri ...?

Bilgiçlikçi olmak için, hayır, böyle bir komutun var olduğunu varsayamazsınız .

Unix'in birçok farklı uygulaması vardır ve her birinin farklı tuhaflıkları vardır. POSIX, ortak payda (ve Unices genelinde bir standarda en yakın şey) için böyle bir seçenek belirtmezgrep .

Diğer cevaplarda belirtildiği gibi, GNU'nun uygulanması, grepistediğinizi yapan standart dışı bir seçeneğe sahiptir. Bu özel uygulama Linux sistemlerinde yaygın olsa da, bazı Linux sistemlerinde bile herhangi bir Unix'te kullanılabilirliğini kabul edemezsiniz.

Son olarak, her şeyi aynı anda yapmaya çalışan tek bir büyük monolitik çalıştırıcının kullanımı üzerinde birkaç ilkel programın kombinasyonunu tercih etmenin Unix felsefesi olduğunu belirtmeliyim .

Sizin durumunuzda, dosya sistemini taramak ve bir akıştaki normal ifadeyi eşleştirmek iki ayrı görevdir. Her birine ayrı bir programda davranmak normaldir.


0

Verilen dizindeki dizeyi bulmak için aşağıdaki komutu kullanın

find <fullDirectoryPath> -name '*' -exec grep -l '<StringToFind>' {} \;

Örneğin:

find /apps_bev/apps/xfer/export/02210 -name '*' -exec grep -l '38221000001032' {} \;

1
grepKullanmak bu yüzden, argüman olarak birden fazla dosya alabilir +yerine \;bir çalışan önlemek için grepoldukça verimsiz dosya başına çağrılmasına.
Stéphane Chazelas

1
O Not -name '*'adı (bazı güncel yerel ayarda geçerli metni olan dosyalara kısıtlar finden azından uygulamaları), ancak diğer dizin bileşenleri hala geçerli karakterleri oluşturmayan bayt dizileri içerebilir. Bununla niyetiniz -name '*'çıktının geçerli metin olduğundan emin olmaksa (yanlış adlara sahip dosyaları atlayarak), yanlış adlara sahip dizinlere inmeyi find ... ! -name '*' -prune -o -exec grep ... {} +de durdurabilirsiniz find.
Stéphane Chazelas
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.