Jak mogę użyć grep, aby znaleźć słowo w folderze?

542

W systemie Windows szukałbym słowa w folderze. Podobnie chcę wiedzieć, czy określone słowo występuje w katalogu zawierającym wiele podkatalogów i plików. Moje wyszukiwanie składni grep pokazuje, że muszę podać nazwę pliku, tj grep string filename.

Teraz nie znam nazwy pliku, więc co mam zrobić? Przyjaciel zasugerował, aby to zrobić grep -nr string, ale nie wiem, co to oznacza, i nie uzyskałem żadnych rezultatów (dopóki nie wydam odpowiedzi ctrl + c).

kiki
źródło

Odpowiedzi:

848
grep -nr 'yourString*' .

Kropka na końcu przeszukuje bieżący katalog. Znaczenie dla każdego parametru:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Znalazłby MobileAppServlet.javalub MobileAppServlet.classlub MobileAppServlet.txt; 'MobileAppASer*.*'jest inny sposób to zrobić to samo).

Aby sprawdzić więcej parametrów, użyj polecenia man grep .

Manish Ranjan
źródło
14
O co chodzi z tym biznesem *? Spowoduje to albo rozwinięcie znaku wieloznacznego powłoki (jeśli istnieją nazwy plików pasujące do wzoru wieloznacznego), albo grep przyjmie go jako operator 0 lub więcej powtórzeń dla poprzedzającego znaku *.
usta
7
Teraz rozważmy obie możliwości grep -nr MobileAppSer* .1. Załóżmy, że mamy 3 pliki w bieżącym katalogu pasującego MobileAppSer*wildcard wzoru: nazwie MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Następnie grepzostanie wywołany tak: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Oznacza wyszukiwanie tekstu „MobileAppServlet.class” w plikach MobileAppServlet.java, MobileAppServlet.txt i innych miejscach w bieżącym katalogu - co z pewnością nie jest tym, czego użytkownik chce tutaj.
usta
7
2. W przypadku, gdy w bieżącym katalogu nie ma plików pasujących do MobileAppSer*wzorca wieloznacznego, grepotrzyma argument MobileAppSer*w takiej postaci, w jakiej jest, i tym samym weźmie go za wyszukiwanie tekstu „MobileAppSe”, po którym następuje 0 lub więcej wystąpień „r”, więc będzie próbować znaleźć teksty „MobileAppSe”, „MobileAppSer”, „MobileAppSerr”, „MobileAppSerrr” itp. w zawartości plików w bieżącym katalogu - nie to, czego chce użytkownik.
usta
5
Jest to wątpliwy wybór wyrażenia regularnego. Usta zwrócił na to uwagę.
kindasimple
117
grep -nr string my_directory

Dodatkowe uwagi: spełnia to składnię, grep [options] string filenameponieważ w systemach uniksowych katalog jest rodzajem pliku (istnieje termin „zwykły plik”, który konkretnie odnosi się do encji, które w systemie Windows nazywane są po prostu „plikami”).

grep -nr string odczytuje zawartość do wyszukiwania ze standardowego wejścia, dlatego po prostu czeka tam na dane wejściowe od ciebie i przestaje to robić po naciśnięciu ^ C (zatrzyma się również na ^ D, co jest kombinacją klawiszy na końcu -plik).

usta
źródło
1
Hej, więc jeśli chcę wyszukać ciąg niezależnie od przypadku, muszę to zrobić: grep -i -nr "moje słowo".
kiki
2
@kiki: Tak, co jest równoważnegrep -inr "my word" .
usta
16
@kiki: -rdla grep oznacza rekursywnie wyszukiwanie w podkatalogach i -noznacza prefiks każdego wiersza wyniku odpowiadającym mu numerem wiersza pliku zawierającego tę linię. man grepopisuje to wszystko i wiele więcej.
usta
62

GREP : Globalne wyrażenie regularne Drukuj / Parser / Procesor / Program.
Możesz użyć tego do przeszukiwania bieżącego katalogu.
Możesz określić -R dla „rekurencyjnego”, co oznacza, że ​​program wyszukuje we wszystkich podfolderach i ich podfolderach oraz podfolderach ich podfolderów itp.

grep -R "your word" .

-nwypisze numer wiersza, w którym pasował do pliku.
-iwyszuka małe i wielkie litery (wielkie / małe litery).

grep -inR "your regex pattern" .
Stefan Steiger
źródło
3
./* oznacza wszystkie pliki w bieżącym katalogu, -R oznacza rekurencyjne (przeszukiwanie podkatalogów itp.)
Stefan Steiger,
25
grep -nr search_string search_dir

wykona WYKONANIE (co oznacza katalog i wszystkie jego podkatalogi) w celu wyszukania łańcucha szukanego. (jak poprawnie odpowiedział usta).

Powód, dla którego nie otrzymałeś żadnych odpowiedzi z sugestią znajomego:

grep -nr string

to dlatego, że nie określono katalogu. Jeśli znajdujesz się w katalogu, w którym chcesz przeprowadzić wyszukiwanie, musisz wykonać następujące czynności:

grep -nr string .

Ważne jest, aby dołączyć „.” znak, ponieważ mówi to grepowi przeszukiwanie TEGO katalogu.

Nico Huysamen
źródło
Cześć, co mam zrobić, jeśli muszę wyszukać 2 słowa ze spacją między nimi? Czy słowa należy podawać w cudzysłowie? tzn. grep -nr „moje słowo”.
kiki
24

Jest także:

find directory_name -type f -print0 | xargs -0 grep -li word

ale dla początkującego może to być trochę więcej.

findjest walkerem / listerem katalogu ogólnego przeznaczenia, -type foznacza „szukaj zwykłych plików zamiast katalogów i nazwanych potoków i tego, co masz”, -print0oznacza „wydrukuj je na standardowym wyjściu, używając znaków zerowych jako ograniczników”. Dane wyjściowe findsą wysyłane do, xargs -0które pobiera standardowe dane fragmentami (aby uniknąć ograniczeń długości wiersza poleceń), używając znaków zerowych jako separatora rekordów (zamiast standardowego nowego wiersza) i dotyczy grep -li wordkażdego zestawu plików. Z grep, -loznacza „listy plików mecz” i -ioznacza „przypadek niewrażliwe”; zazwyczaj możesz łączyć opcje pojedynczych postaci, aby -liczęściej niż -l -i.

Jeśli nie użyjesz, -print0a -0następnie napotkasz problemy z nazwami plików zawierającymi spacje, więc używanie ich jest dobrym nawykiem.

mu jest za krótki
źródło
1
@mmmshuddup: Dzięki. Źle się czuję, jeśli nie udzielę wyjaśnień jako części odpowiedzi, szczególnie podczas pracy z początkującym.
mu jest za krótki
1
Najbardziej doceniam to na tej stronie. Ważne jest, aby pamiętać, że wszyscy byliśmy początkującymi raz i nie jest łatwo wejść w świat technologii!
Tak Barry
czy mogę wykluczyć niektóre katalogi? @muistooshort
Ferologics
@Ferologics Powinno być, sprawdź man findw wierszu poleceń, jakie opcje findobsługuje.
mu jest za krótki
8

Dlaczego nie przeprowadzić wyszukiwania rekurencyjnego, aby znaleźć wszystkie wystąpienia w podkatalogach:

grep -r 'text' *

To działa jak urok.

Paxwell
źródło
1
Nie trzeba cytować szukanego ciągu bez specjalnych znaków, takich jak spacje
Scott Stensland,
5
  1. grep -r "yourstring" * Znajdzie „twój ciąg” w dowolnych plikach i folderach

Teraz, jeśli chcesz szukać dwóch różnych ciągów jednocześnie, zawsze możesz użyć opcji E i dodać słowa do wyszukiwania. przykład po przerwie

  1. grep -rE "yourstring|yourotherstring|$" *wyszuka lokalizacje na liście, w których yourstringlub yourotherstringpasuje
Nwaoga
źródło
4

Inna opcja, którą lubię używać:

find folder_name -type f -exec grep your_text  {} \;

-type f zwraca tylko pliki, a nie foldery

-exec i {} uruchamia grep na plikach znalezionych podczas wyszukiwania (dokładna składnia to „-exec command {}”).

jfhfhf839
źródło
4
grep -R "string" /directory/

-R śledzi także dowiązania symboliczne, gdy -r nie.

DimiDak
źródło
2

Wybrana odpowiedź jest w porządku i działa, ale nie jest to właściwy sposób, ponieważ:

grep -nr yourString* .

To faktycznie przeszukuje ciąg "yourStrin"i "g"0 lub wiele razy.

Tak więc właściwym sposobem jest:

grep -nr \w*yourString\w* .

To polecenie przeszukuje ciąg znaków z dowolnym znakiem przed i po bieżącym folderze.

eLRuLL
źródło
2
jednak grep -nr yourStringdziała również, ponieważ szuka goły yourStringgdziekolwiek w linii (lub przynajmniej robi to w moim systemie, OSX Lion)
theheadofabroom
1

Podobnie do odpowiedzi opublikowanej przez @eLRuLL, łatwiejszym sposobem na określenie wyszukiwania, które szanuje granice słów, jest skorzystanie z -wopcji:

grep -wnr "yourString" .
Mike Slinn
źródło
W wierszu polecenia cmd lub terminalu Windows termin grep nie jest rozpoznawany
kouty
@kouty grep jest poleceniem uniksowym. itechtics.com/using-findstr-windows
Hugo M. Zuleta
1

Uruchom (terminal) następującą komendę w katalogu. Rekurencyjnie sprawdzi również podkatalogi.

grep -r 'your string goes here' * 
Iwantha
źródło
0

Poniższy przykładowy wygląd rekurencyjnie dla your search stringna *.xmli *.jspliki znajdujące się gdzieś wewnątrz folderów path1, path2a path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

Możesz więc wyszukiwać w podzestawie plików wiele katalogów, podając tylko ścieżki na końcu.

Yumper
źródło
-4

Nie używaj grep. Pobierz Silver Searcher lub ripgrep . Oba są wyjątkowe i znacznie szybsze niż grep lub ack z mnóstwem opcji.

AAAfarmclub
źródło
2
Te być może świetne narzędzia, ale to nie odpowiada, w jaki sposób użyłbym tych narzędzi, aby osiągnąć to, o co prosi OP.
Mateusz