Grep ve dosya desenleriyle özyinelemeli metin araması


46

Bu örnek klasör yapısı göz önüne alındığında:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

Yinelemeli bir metin aramasını "/" *.txtile tüm dosyalarda nasıl yaparım grep?

( "grep -r <pattern> *.txt""/" den çalıştırıldığında başarısız olur, çünkü .txto klasörde dosya yoktur .)

Yanıtlar:


61

GNU Grep sürümümün bunun için bir anahtarı var:

grep -R --include='*.txt' $Pattern

Aşağıdaki gibi tanımlanmıştır:

--include=GLOB

Yalnızca temel adı GLOB ile eşleşen dosyaları arayın (--exclude bölümünde açıklandığı şekilde joker karakter eşleşmesini kullanın).


19

Çok sayıda dosyanız varsa, bir 'Argüman listesi çok uzun' hatasını önlemek için xargs komutunu komuta dahil etmek faydalı olacaktır.

find . -name '*.txt' -print | xargs grep <pattern>

6
Dosya veya dizin adlarından herhangi birinde boşluk varsa, bu formu kullanın: bulun. -name '* .txt' -print0 | xargs -0 grep <pattern>
Jason Luther

2
Ve elbette, bununla başlayan dosya isimleri sorunu var -.
TJ Crowder

grepdaha hızlı find.
Nabi KAZ

2

Eğer yararlanmak mümkün olabilir zshbireyin EXTENDED_GLOBseçeneğiyle ( docs )

grep <pattern> **/*.txt

Sadece OP zsh kullanıyorsa, ama yine de ilginç.
Yasa29,



0

Mannis cevabı, her metin dosyası için yeni bir grep sürecini destekleyecektir. Eğer varsa çok orada TextFiles yapıldığından, önce her dosyayı grepping düşünebilirsiniz ve şu bittiğinde .txt dosyalarını seçmek:

grep -r <pattern> * | grep \.txt:

Bu daha disk yoğun, ancak yine de daha hızlı olabilir.


0

2019 ve yinelemeli metin araması için hala grep kullanmamın bir yolu yok.

IMHO bugünün cevapları ripgrep içermelidir :

rg <pattern> -ttxt
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.