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).
*
? 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*
.grep -nr MobileAppSer* .
1. Załóżmy, że mamy 3 pliki w bieżącym katalogu pasującegoMobileAppSer*
wildcard wzoru: nazwieMobileAppServlet.java
,MobileAppServlet.class
,MobileAppServlet.txt
. Następniegrep
zostanie 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.MobileAppSer*
wzorca wieloznacznego,grep
otrzyma argumentMobileAppSer*
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.Dodatkowe uwagi: spełnia to składnię,
grep [options] string filename
ponieważ 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).źródło
grep -inr "my word" .
-r
dla grep oznacza rekursywnie wyszukiwanie w podkatalogach i-n
oznacza prefiks każdego wiersza wyniku odpowiadającym mu numerem wiersza pliku zawierającego tę linię.man grep
opisuje to wszystko i wiele więcej.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.
-n
wypisze numer wiersza, w którym pasował do pliku.-i
wyszuka małe i wielkie litery (wielkie / małe litery).źródło
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:
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:
Ważne jest, aby dołączyć „.” znak, ponieważ mówi to grepowi przeszukiwanie TEGO katalogu.
źródło
Jest także:
ale dla początkującego może to być trochę więcej.
find
jest walkerem / listerem katalogu ogólnego przeznaczenia,-type f
oznacza „szukaj zwykłych plików zamiast katalogów i nazwanych potoków i tego, co masz”,-print0
oznacza „wydrukuj je na standardowym wyjściu, używając znaków zerowych jako ograniczników”. Dane wyjściowefind
są wysyłane do,xargs -0
któ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 dotyczygrep -li word
każdego zestawu plików. Zgrep
,-l
oznacza „listy plików mecz” i-i
oznacza „przypadek niewrażliwe”; zazwyczaj możesz łączyć opcje pojedynczych postaci, aby-li
częściej niż-l -i
.Jeśli nie użyjesz,
-print0
a-0
następnie napotkasz problemy z nazwami plików zawierającymi spacje, więc używanie ich jest dobrym nawykiem.źródło
man find
w wierszu poleceń, jakie opcjefind
obsługuje.Dlaczego nie przeprowadzić wyszukiwania rekurencyjnego, aby znaleźć wszystkie wystąpienia w podkatalogach:
To działa jak urok.
źródło
grep -r "yourstring" *
Znajdzie „twój ciąg” w dowolnych plikach i folderachTeraz, 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
grep -rE "yourstring|yourotherstring|$" *
wyszuka lokalizacje na liście, w którychyourstring
lubyourotherstring
pasujeźródło
Inna opcja, którą lubię używać:
-type f zwraca tylko pliki, a nie foldery
-exec i {} uruchamia grep na plikach znalezionych podczas wyszukiwania (dokładna składnia to „-exec command {}”).
źródło
-R śledzi także dowiązania symboliczne, gdy -r nie.
źródło
Wybrana odpowiedź jest w porządku i działa, ale nie jest to właściwy sposób, ponieważ:
To faktycznie przeszukuje ciąg
"yourStrin"
i"g"
0 lub wiele razy.Tak więc właściwym sposobem jest:
To polecenie przeszukuje ciąg znaków z dowolnym znakiem przed i po bieżącym folderze.
źródło
grep -nr yourString
działa również, ponieważ szuka gołyyourString
gdziekolwiek w linii (lub przynajmniej robi to w moim systemie, OSX Lion)Podobnie do odpowiedzi opublikowanej przez @eLRuLL, łatwiejszym sposobem na określenie wyszukiwania, które szanuje granice słów, jest skorzystanie z
-w
opcji:źródło
Uruchom (terminal) następującą komendę w katalogu. Rekurencyjnie sprawdzi również podkatalogi.
źródło
Poniższy przykładowy wygląd rekurencyjnie dla
your search string
na*.xml
i*.js
pliki znajdujące się gdzieś wewnątrz folderówpath1
,path2
apath3
.Możesz więc wyszukiwać w podzestawie plików wiele katalogów, podając tylko ścieżki na końcu.
źródło
Nie używaj grep. Pobierz Silver Searcher lub ripgrep . Oba są wyjątkowe i znacznie szybsze niż grep lub ack z mnóstwem opcji.
źródło