Rekurencyjne wyszukiwanie tekstu z wzorami grep i plików

46

Biorąc pod uwagę tę przykładową strukturę folderów:

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

Jak przeprowadzić rekursywne wyszukiwanie tekstu we wszystkich *.txtplikach z grep„/”?

( "grep -r <pattern> *.txt"kończy się niepowodzeniem po uruchomieniu z „/”, ponieważ .txtw tym folderze nie ma żadnych plików).

Anders Sandvig
źródło

Odpowiedzi:

61

Moja wersja GNU Grep ma przełącznik do tego:

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

Opisane w następujący sposób:

--include=GLOB

Przeszukuj tylko pliki, których podstawowa nazwa pasuje do GLOB (używając dopasowywania symboli wieloznacznych, jak opisano w --exclude).

Kyle Brandt
źródło
19

Jeśli masz dużą liczbę plików, warto włączyć xargs do polecenia, aby uniknąć błędu „zbyt długiej listy argumentów”.

find . -name '*.txt' -print | xargs grep <pattern>
znak
źródło
6
Jeśli w nazwach plików lub katalogów są spacje, użyj tego formularza: znajdź. -nazwa „* .txt” -print0 | xargs -0 grep <pattern>
Jason Luther
2
I oczywiście jest kwestia nazw plików, które zaczynają się od -.
TJ Crowder
grepjest szybszy od find.
Nabi KAZ
2

może być w stanie wykorzystać swojego zsh„s EXTENDED_GLOBopcji ( dokumentacja )

grep <pattern> **/*.txt
Święty
źródło
Tylko jeśli OP używa zsh, ale mimo to interesujące.
Ustawa 29
1

Możesz zajrzeć na stronę http://betterthangrep.com , która oferuje funkcje wyboru plików do wyszukiwania według typu pliku.

Andy Lester
źródło
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
źródło
możesz zamiast tego użyć polecenia „znajdź. -nazwa * * .txt” -type f -exec grep <pattern> {} + ”, aby zachowywał się podobnie do wersji Mark Robinson - działa tylko z GNU find według mojej wiedzy
serverhorror
0

Odpowiedź Mannisa rozwinęłaby nowy proces grep dla każdego pliku tekstowego. Jeśli masz tam wiele plików tekstowych, możesz rozważyć grepowanie każdego pliku i wybranie plików .txt, gdy to zrobisz:

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

To wymaga więcej miejsca na dysku, ale i tak może być szybsze.

Komandor Keen
źródło
0

Jest rok 2019 i nie ma mowy, żebym nadal używał grep do rekurencyjnego wyszukiwania tekstu.

Dzisiejsze odpowiedzi IMHO powinny obejmować ripgrep :

rg <pattern> -ttxt
Święty
źródło