42 Pytanie: Jak znaleźć wszystkie pliki zawierające określony tekst w systemie Linux?

pytanie utworzone w Sun, May 21, 2017 12:00 AM

Próbuję znaleźć sposób na zeskanowanie całego systemu Linux pod kątem wszystkich plików zawierających określony ciąg tekstu. Aby wyjaśnić, szukam tekstu w pliku, a nie w nazwie pliku.

Kiedy szukałem, jak to zrobić, natknąłem się na to rozwiązanie dwukrotnie:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Jednak to nie działa. Wygląda na to, że wyświetla każdy pojedynczy plik w systemie.

Czy to jest zbliżone do właściwego sposobu, aby to zrobić? Jeśli nie, jak powinienem? Ta umiejętność znajdowania ciągów tekstowych w plikach byłaby niezwykle przydatna w niektórych projektach programistycznych, które wykonuję.

    
4579
  1. pamiętaj, że grep zinterpretuje między innymi . jako jednoznakowy symbol wieloznaczny. Moja rada brzmi: zawsze używaj fgrep lub egrep.
    2013-10-28 11: 54: 06Z
  2. i tak już prawie byłeś! Wystarczy wymienić -H na -l (i może grep na fgrep). Aby wykluczyć pliki o określonych wzorach nazw, użyłbyś find w bardziej zaawansowany sposób. Warto jednak nauczyć się korzystać z find. Tylko man find.
    2013-10-28 12: 01: 23Z
  3. find … -exec <cmd> + jest łatwiejszy do wpisania i szybszy niż find … -exec <cmd> \;. Działa tylko wtedy, gdy <cmd> akceptuje dowolną liczbę argumentów nazwy pliku. Oszczędność czasu wykonania jest szczególnie duża, jeśli <cmd> powoli się uruchamia, podobnie jak skrypty Pythona lub Rubiego.
    2016-01-28 05: 16: 24Z
  4. Aby szukać nie rekurencyjnie w podanej ścieżce, poleceniem jest `grep --include = *. txt -snw" wzorzec "ścieżka /*.
    2016-08-15 12: 34: 35Z
  5. @ StéphaneLaurent Myślę, że za bardzo to komplikujesz. Wystarczy powiedzieć grep "pattern" path/*.txt
    2016-12-02 13: 13: 16Z
  6. 30 odpowiedzi                              30                         

    Wykonaj następujące czynności:

    grep -rnw '/path/to/somewhere/' -e 'pattern'
    
    • -r lub -R ma charakter rekurencyjny,
    • -n to numer linii i
    • -w oznacza dopasowanie całego słowa.
    • -l (małe litery L) można dodać, aby nadać nazwę pliku pasującym plikom.

    Wraz z tymi, --exclude, --include, --exclude-dir flagi mogą być użyte do efektywnego wyszukiwania:

    • To przeszuka tylko te pliki, które mają rozszerzenia .c lub .h:

      grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
      
    • To wyklucza przeszukiwanie wszystkich plików z rozszerzeniem .o:

      grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
      
    • W przypadku katalogów możliwe jest wykluczenie określonego katalogu (ów) poprzez parametr --exclude-dir. Na przykład wyklucza to katalogi dir1 /, dir2 /i wszystkie pasują do * .dst /:

      grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
      

    To działa bardzo dobrze dla mnie, aby osiągnąć prawie taki sam cel jak twój.

    Aby uzyskać więcej opcji, sprawdź man grep.

        
    8280
    2018-01-04 03: 57: 06Z
    1. use --exclude. jak "grep -rnw --exclude = *. o 'katalog' -e" wzorzec "
      2013-06-06 08: 29: 44Z
    2. Uważam, że parametr grep --include jest bardzo przydatny. Na przykład: grep -rnw --include = *. Java. -e „Cokolwiek szukam”
      2013-11-14 15: 43: 41Z
    3. warto zauważyć: wygląda na to, że opcja r jest leniwa (głębia trawersów po raz pierwszy, niż zatrzymuje się po pierwszym katalogu), podczas gdy R jest chciwy (przejdzie przez całe drzewo poprawnie).
      2015-03-24 15: 09: 46Z
    4. Uwaga (szczególnie dla początkujących): Znaczniki cudzysłowu w powyższym poleceniu są ważne.
      2015-12-22 12: 37: 38Z
    5. @ Eliran Malka R pl r przejdzie poprawnie przez katalogi, ale R będzie śledzić dowiązania symboliczne.
      2016-07-05 08: 36: 40Z

    Możesz użyć grep -ilR:

    grep -Ril "text-to-find-here" /
    
    • i oznacza ignoruj ​​wielkość liter (opcjonalnie w twoim przypadku).
    • R oznacza rekurencyjne.
    • l oznacza „pokaż nazwę pliku, a nie sam wynik”.
    • / oznacza rozpoczęcie od katalogu głównego komputera.
    1313
    2016-02-23 10: 02: 31Z
    1. Z mojego doświadczenia wynika, że ​​-i znacznie go spowalnia, więc nie używaj go, jeśli nie jest to konieczne. Przetestuj go w pewnym reżimie, a następnie uogólnij. Powinno się zakończyć w ciągu kilku minut. Myślę, że wyrażenie regularne spowolniłoby to. Ale moje komentarze opierają się na przypuszczeniach, sugeruję przetestowanie go z linią time.
      2013-06-06 08: 14: 37Z
    2. Tak, /* oznacza to. W każdym razie przetestowałem to i zauważyłem, że działa tylko /.
      2013-06-06 08: 15: 21Z
    3. Jeśli nie szukasz za pomocą wyrażenia regularnego, możesz użyć fgrep zamiast grep na większości systemów.
      2013-09-28 14: 49: 37Z
    4. Yes @ markle976, w rzeczywistości od man grep: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
      2013-09-30 08: 23: 43Z
    5. Możesz zamienić ścieżkę na katalog grep -Ril "text-to-find-here" ~/sites/ lub użyć. dla bieżącego katalogu grep -Ril "text-to-find-here" .
      2016-01-28 12: 19: 30Z

    Możesz użyć ack . To jest jak grep dla kodu źródłowego. Możesz skanować cały system plików.

    Po prostu wykonaj:

    ack 'text-to-find-here'
    

    W twoim katalogu głównym.

    Możesz także użyć wyrażeń regularnych , określić typ pliku itp.


    UPDATE

    Właśnie odkryłem The Silver Searcher , który jest podobny do potwierdzenia, ale 3-5x szybszy od niego, a nawet ignoruje wzory z .gitignore plik.

        
    287
    2015-03-12 12: 31: 20Z
    1. Bardzo przydatny, prosty i szybki. Ostrzeżenie: „Na dystrybucjach pochodnych Debiana ack jest pakowany jako„ ack-grep ”, ponieważ„ ack ”już istniał” (z beyondgrep.com/install ). Możesz uruchomić konwerter kodu Kanji na tych Linuxach ...
      2013-09-20 13: 32: 27Z
    2. ack lub ack-grep ma ładne akcenty, ale znajdź +grep, gdy jest używany, jest znacznie lepszy w działaniu
      2015-02-11 09: 00: 16Z
    3. Pamiętaj, że ripgrep jest szybszy niż cokolwiek o innych tutaj wymienionych, w tym The Silver Searcher i plain 'ol grep. Zobacz ten wpis na blogu w celu sprawdzenia.
      2017-10-14 04: 01: 00Z

    Możesz użyć:

    grep -r "string to be searched"  /path/to/dir
    

    r oznacza rekursywne, więc będzie przeszukiwać określoną ścieżkę, a także jej podkatalogi. To powie ci nazwę pliku, a także wydrukuje linię w pliku, w którym pojawia się ciąg.

    Lub polecenie podobne do tego, którego próbujesz (przykład:) do wyszukiwania we wszystkich plikach javascript (* .js):

    find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
    

    Spowoduje to wydrukowanie linii w plikach, w których pojawia się tekst, ale nie drukuje nazwy pliku.

    Oprócz tego polecenia możemy również napisać to: grep -rn „String do wyszukiwania” /ścieżka /do /katalog /lub /plik -r: wyszukiwanie rekurencyjne n: numer linii będzie wyświetlany dla dopasowań

        
    163
    2018-04-02 08: 35: 40Z
    1. Thanx dla wersji find. Moja wersja grep (busybox dla NAS) nie ma opcji -r, naprawdę potrzebowałem innego rozwiązania!
      2016-09-02 10: 34: 12Z
    2. Dziękujemy za wersję 'find'! Jest tak ważne, aby móc filtrować według „ .js” lub „ .txt” itd. Nikt nie chce spędzać godzin na czekaniu na grep, aby zakończyć przeszukiwanie wszystkich filmów z wieloma gigabajtami z ostatniej rodziny wakacje, nawet jeśli polecenie jest łatwiejsze do wpisania.
      2017-08-16 15: 10: 25Z

    Możesz użyć tego:

    grep -inr "Text" folder/to/be/searched/
    
        
    99
    2013-07-31 14: 09: 59Z
    1. najłatwiejszy, gadatliwy, rekurencyjny i niewrażliwy na wielkość liter. kciuki do góry.
      2015-04-09 12: 44: 43Z
    2. jeśli dodasz -A3 jest jeszcze lepszy
      2016-02-24 10: 43: 04Z

    Lista nazw plików zawierających dany tekst

    Przede wszystkim uważam, że użyłeś -H zamiast -l. Możesz również spróbować dodać tekst w cudzysłowie, a następnie {} \.

    find / -type f -exec grep -l "text-to-find-here" {} \; 
    

    Przykład

    Powiedzmy, że szukasz plików zawierających określony tekst „Licencja Apache” wewnątrz katalogu. Wyświetlone zostaną wyniki podobne do poniższych (dane wyjściowe będą różne w zależności od zawartości katalogu).

    bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
    ./net/java/jvnet-parent/5/jvnet-parent-5.pom
    ./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
    ./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
    ./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
    ./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
    ./commons-io/commons-io/2.4/commons-io-2.4.pom
    bash-4.1$ 
    

    Usuń wrażliwość przypadku

    Nawet jeśli nie używasz przypadku, takiego jak „tekst” czy „TEKST”, możesz użyć przełącznika -i, aby zignorować wielkość liter. Więcej szczegółów możesz przeczytać tutaj .

    Mam nadzieję, że to pomoże.

        
    60
    2017-10-07 05: 54: 21Z
    1. Co robi to polecenie: find przekaże wszystkie znalezione ścieżki do polecenia grep -l "text-to-find-here" <file found>". Możesz dodać ograniczenia do nazwy pliku, np. find / -iname "*.txt" do wyszukiwania tylko w plikach, których nazwa kończy się .txt
      2017-04-20 13: 46: 45Z
    2. @ Auxiliary - zawiera przykładowy wynik, aby uniknąć nieporozumień dla czytelników.
      2017-10-07 05: 56: 16Z
    3. @ Mene To naprawdę smutne, że komentarz Auxiliary ma więcej głosów niż twój ... nawet jeśli ich komentarz pochodzi z 2014 roku, a twój jest 2017, że ich komentarz ma 6, kiedy powinien mieć dokładnie 0, a twój miał tylko jeden (teraz dwa) nie jest czymś, w co chciałbym wierzyć.
      2018-05-01 23: 01: 52Z
    4. @ Mene To znaczy, że -iname nie uwzględnia wielkości liter, co oznacza, że ​​znajdzie także pliki .TXT, a także TxT i TXt itd.
      2018-05-01 23: 04: 37Z

    grep ( GNU lub BSD )

    Możesz użyć grep narzędzia do wyszukiwania rekurencyjnego bieżącego folderu, takiego jak:

    grep -r "class foo" .
    

    Uwaga: -r - Rekurencyjnie przeszukuj podkatalogi.

    Możesz także użyć składni globowania, aby przeszukać określone pliki, takie jak:

    grep "class foo" **/*.c
    

    Uwaga: Używając opcji globowania ( **), skanuje wszystkie pliki rekurencyjnie z określonym rozszerzeniem lub wzorem. Aby włączyć tę składnię, uruchom: shopt -s globstar . Możesz także użyć **/*.* dla wszystkich plików (z wyjątkiem ukryty i bez rozszerzenia) lub dowolny inny wzór.

    Jeśli masz błąd, że argument jest za długi, rozważ zawężenie wyszukiwania lub użyj składni find, na przykład:

    find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
    

    Alternatywnie użyj ripgrep .

    ripgrep

    Jeśli pracujesz nad większymi projektami lub dużymi plikami, powinieneś użyć ripgrep, na przykład:

    rg "class foo" .
    

    Pobierz dokumenty, kroki instalacji lub kod źródłowy na stronie projektu GitHub . sup>

    Jest znacznie szybszy niż jakiekolwiek inne narzędzie, takie jak GNU / BSD grep , ucg , ag , sift , ack , pt lub podobnym, ponieważ jest zbudowany na silniku wyrażeń regularnych Rusta , który wykorzystuje skończone automaty, SIMD i agresywne optymalizacje dosłowne do wykonania wyszukiwanie bardzo szybko.

    Obsługuje wzorce ignorowania określone w plikach .gitignore, więc pojedyncza ścieżka pliku może być dopasowana jednocześnie do wielu wzorców globu.


    Możesz użyć wspólnych parametrów, takich jak:

    • -i - Wyszukiwanie niewrażliwe.
    • -I - Ignoruj ​​pliki binarne.
    • -w - Wyszukaj całe słowa (w przeciwieństwie do częściowego dopasowania słów).
    • -n - Pokaż linię swojego meczu.
    • -C/--context (np. -C5) - zwiększa kontekst, dzięki czemu można zobaczyć otaczający go kod.
    • --color=auto - Zaznacz odpowiedni tekst.
    • -H - Wyświetla nazwę pliku, w którym znajduje się tekst.
    • -c - Wyświetla liczbę pasujących linii. Może być compołączone z -H.
    55
    2018-04-10 13: 55: 15Z
    1. Uważam również, że rozszerzony globbing jest użyteczny. Należy jednak pamiętać, że jeśli istnieje naprawdę duża liczba plików, można uzyskać błąd „Lista argumentów za długa”. (Proste globowanie jest również podatne na tego rodzaju błędy).
      2017-11-30 06: 47: 02Z
    2. Aby wdychać cały system plików, rg będzie znacznie mniej bolesne niż prawie każde inne narzędzie.
      2019-04-23 06: 11: 54Z

    Jeśli twój grep nie obsługuje wyszukiwania cyklicznego, możesz połączyć find z xargs:

    find / -type f | xargs grep 'text-to-find-here'
    

    Uważam to za łatwiejsze do zapamiętania niż format find -exec.

    Spowoduje to wyświetlenie nazwy pliku i treści dopasowanej linii, np.

    /home/rob/file:text-to-find-here
    

    Opcjonalne flagi, które możesz dodać do grep:

    • -i - wyszukiwanie bez rozróżniania wielkości liter
    • -l - wyślij tylko nazwę pliku, w którym znaleziono dopasowanie
    • -h - wypisuje tylko dopasowaną linię (nie nazwę pliku)
    51
    2015-08-12 09: 19: 16Z
    1. Jest to odpowiednik grep 'text-to-find-here' bez nazwy pliku, jeśli find nie znajdzie niczego. To się zawiesi i zaczekaj na dane użytkownika! Dodaj --no-run-if-empty jako opcję do xargs.
      2016-01-28 05: 46: 33Z
    2. Ta kombinacja find i xargs nie działa zgodnie z przeznaczeniem, jeśli nazwy plików lub katalogów zawierają spacje (znaki, które xargs interpretuje jako separatory). Użyj find … -exec grep … +. Jeśli nalegasz na używanie find razem z xargs, użyj -print0 i -0.
      2016-01-28 05: 50: 11Z
    grep -insr "pattern" *
    
    • i: Ignoruj ​​rozróżnienia wielkości liter zarówno w pliku PATTERN, jak i pliku wejściowym.
    • n: Prefiksuj każdy wiersz wyjścia numerem linii w 1 pliku wejściowym.
    • s: pomiń komunikaty o błędach dotyczące nieistniejących lub nieczytelnych plików.
    • r: Odczytuje wszystkie pliki w każdym katalogu, rekurencyjnie.
    38
    2016-03-08 07: 39: 14Z
    1. Czy możesz wyjaśnić, w jaki sposób twoja odpowiedź poprawia się w stosunku do innych odpowiedzi lub w jaki sposób jest wystarczająco różna od nich?
      2016-02-26 06: 10: 08Z
    2. mało skomplikowane do zapamiętania, obejmie wszystkie wzorce (case-senstivity - > off, zawiera nazwy plików i numery linii i będzie przeprowadzać rekursywnie wyszukiwanie itp.) i używając „*” na końcu przeszuka wszystkie katalogi (nie trzeba podawać żadnej ścieżki ani nazwy katalogu).
      2016-02-26 06: 15: 40Z
    3. Przepraszam, powinienem był wyjaśnić: byłoby wspaniale, gdybyś umieścił to wyjaśnienie w swojej odpowiedzi. W obecnej postaci, zwłaszcza przy tak wielu innych podobnych odpowiedziach, z tak krótkiej odpowiedzi trudno jest zobaczyć, jaka byłaby korzyść z wypróbowania it w stosunku do zaakceptowanej odpowiedzi lub jednej z wyżej wymienionych.
      2016-02-26 06: 35: 01Z
    4. @ AmosM.Carpenter Jedną z rzeczy, które kocham w tej odpowiedzi, jest powymyślenie argumentu tłumienia, który może pomóc w odfiltrowaniu szumu, który nie ma znaczenia dla uzyskania pożądanych wyników. Grep wypisuje na niektórych „plikach” błędy, takie jak „Funkcja nie zaimplementowana”, „Nieprawidłowy argument”, „Zasób niedostępny” itp. Itp.
      2017-02-20 05: 58: 27Z
    5. @ leetNightshade: Zakładam, że kierujesz swój komentarz do mnie, ponieważ poprosiłem o wyjaśnienie na rzadkim oryginalnym poście. Zobacz wspaniałe wersję Fabia, aby moje poprzednie komentarze miały sens.
      2017-02-20 11: 59: 14Z
      

    Jak znaleźć wszystkie pliki zawierające określony tekst w systemie Linux?   (...)

         

    Znalazłem to rozwiązanie dwukrotnie:

         

    find / -type f -exec grep -H 'text-to-find-here' {} \;


    Jeśli używasz znajdź podobnie jak w Twoim przykładzie, lepiej dodaj -s (--no-messages) do grep i 2>/dev/null na końcu polecenia, aby uniknąć wielu komunikatów Odmowa uprawnień wystawionych przez grep i find:

    find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null
    

    znajdź to standardowe narzędzie do wyszukiwania plików - w połączeniu z grep podczas wyszukiwania określonego tekstu - na platformach uniksopodobnych. Polecenie znajdź często łączy się z xargs , nawiasem mówiąc.

    Szybsze i łatwiejsze narzędzia istnieją w tym samym celu - patrz poniżej. Lepiej ich spróbuj, pod warunkiem, że są dostępne na twojej platformie , oczywiście:

    Szybsze i łatwiejsze alternatywy

    RipGrep - najszybsze narzędzie do wyszukiwania wokół:

    rg 'text-to-find-here' / -l
    

    Srebrny wyszukiwarka :

    ag 'text-to-find-here' / -l
    

    potwierdzenie :

    ack 'text-to-find-here' / -l
    

    Uwaga: do tych poleceń można również dodać 2>/dev/null, aby ukryć wiele komunikatów o błędach.


    Ostrzeżenie : chyba że naprawdę nie możesz tego uniknąć, nie szukaj w '/' (katalog główny) , aby uniknąć długiego i nieefektywnego wyszukiwania!  W powyższych przykładach lepiej zastąp „ /” nazwą podkatalogu, np. „/home” w zależności od tego, gdzie faktycznie chcesz szukać ...

        
    30
    2018-06-02 17: 21: 54Z
    1. 'find to standardowe narzędzie do wyszukiwania plików zawierających określony tekst na platformach uniksopodobnych' wydaje mi się raczej niejednoznaczne. Nawet poza rekurencyjnym grep find nie przeszukuje bezpośrednio plików wewnątrz tekstu. I może te dodatkowe narzędzia są przydatne dla niektórych, ale starych zegarów i tych, którzy są dobrze przyzwyczajeni np. grep nie dałby ich w ogóle (cóż, na pewno nie). Nie twierdzę jednak, że są bezużyteczne.
      2018-05-01 23: 36: 48Z
    2. ".... zawierający określony tekst ...": ta część zdania nie była dokładna (ponieważ nie znajduje się w tej części wyszukiwania ). Edytowane. Dzięki.
      2018-06-01 09: 21: 33Z
    3. Cieszę się, że mogę pomóc! Jedyne, co jest bardzo szybkie, to zmiana słowa folder na katalog , ale wiem, że to moja krucjata, której nigdy nie wygram. Nie poddając się jednak ...
      2018-06-01 16: 13: 32Z
    4. Dlaczego nie „katalog” zamiast „folder”, ale dlaczego? Podziel się swoją „krucjatą”!
      2018-06-01 17: 00: 56Z
    5. Mówię zamiast tego o katalogu! Odnosząc się do: lepiej zastąpić „/” nazwą podfolderu I to jest mój ulubiony zwierzak. Esp, ponieważ nawet Windows nazywał go „katalogiem”. Ach ... może to masz. Czemu? No bo tak się nazywa. Nazywa się to również na poziomie systemu plików. I spójrz na to w ten sposób: czy kiedykolwiek nazwano to (dla DOS) fol ? Nie, oczywiście nie; nazywa się to dir (i wierzę, że nadal jest). Folder to rzecz stworzona dla (chyba) przyjazności dla użytkownika, ale w tym przypadku może to być głupota dla mniej „zaawansowanych” użytkowników?
      2018-06-02 00: 15: 19Z

    Spróbuj:

    find . -name "*.txt" | xargs grep -i "text_pattern"
    
        
    27
    2015-04-17 15: 33: 47Z
    1. To jest naprawdę dobry przykład, kiedy NIE używać xargs w ten sposób .. rozważ to. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo. xargs tutaj pasuje do pliku WRONG i NIE pasuje do zamierzonego pliku. Albo użyj find .. -print0 | xargs -0 ..., ale to bezużyteczne użycie rury lub lepsze find ... -exec grep ... {} +
      2016-10-11 20: 10: 13Z

    Jest nowe narzędzie o nazwie The Silversearcher

    sudo apt install silversearcher-ag
    

    Współpracuje ściśle z Git i innymi VCS. Więc nie dostaniesz niczego w .git lub innym katalogu.

    Możesz po prostu użyć

    ag -ia "Search query"
    

    I zrobi to za ciebie!

        
    27
    2017-05-25 00: 08: 18Z

    Użyj pwd, aby wyszukać z dowolnego katalogu, w którym się znajdujesz, rekursując w dół

    grep -rnw `pwd` -e "pattern"
    

    Aktualizacja W zależności od używanej wersji grep można pominąć pwd. W nowszych wersjach . wydaje się być domyślnym przypadkiem dla grep, jeśli nie podano żadnego katalogu w ten sposób:

    grep -rnw -e "pattern"

    lub

    grep -rnw "pattern"

    zrobi to samo, co powyżej!

        
    26
    2017-02-02 12: 29: 21Z
    1. użycie pwd nie jest w ogóle konieczne, ponieważ jest to ustawienie domyślne. grep -rnw "pattern" wystarcza.
      2016-12-02 13: 17: 04Z
    2. iw rzeczywistości grep -rnw i podobne jest to, na co odpowiadano trzy lata temu, nie widzę, jak ta odpowiedź dodaje wartości.
      2016-12-02 14: 03: 42Z
    3. Wybrana odpowiedź nie pokazuje domyślnego wzorca, a 5 osób uznało ją za przydatną
      2016-12-14 08: 27: 11Z
    4. Co rozumiesz przez „domyślny wzór”? Przyjęta odpowiedź zawiera grep -rnw '/path/to/somewhere/' -e "pattern", którą masz tutaj. 5 głosów po 2.3M odwiedzinach nie znaczy tak wiele.
      2016-12-14 08: 45: 01Z
    5. Zgadzam się :-) tego, czego brakowało w oryginalnej odpowiedzi, jest przypadek użycia, w którym nie musisz podawać ścieżki w ogóle lub przeszukiwać bieżący katalog rekurencyjnie, co nie znajduje odzwierciedlenia w zaakceptowanej odpowiedzi. Tak więc dobrym pomysłem na grep było wykopanie nieco głębiej.
      2016-12-14 14: 05: 21Z

    grep może być używany, nawet jeśli nie szukamy ciągu.

    Po prostu działa,

    grep -RIl "" .
    

    wydrukuje ścieżkę do wszystkich plików tekstowych, tj. zawierających tylko znaki drukowalne.

        
    18
    2017-05-25 00: 01: 43Z
    1. Nie widzę, jak to jest lepsze niż użycie tylko ls lub find (dla rekurencyjnego)
      2016-12-02 13: 15: 42Z

    Oto kilka list poleceń, które można wykorzystać do wyszukiwania plików.

    grep "text string to search” directory-path
    
    grep [option] "text string to search” directory-path
    
    grep -r "text string to search” directory-path
    
    grep -r -H "text string to search” directory-path
    
    egrep -R "word-1|word-2” directory-path
    
    egrep -w -R "word-1|word-2” directory-path
    
        
    16
    2014-02-01 05: 47: 35Z
    1. co to dodaje do istniejących odpowiedzi?
      2016-12-02 13: 14: 58Z
    2. @ fedorqui egrep jest odpowiednikiem grep -E i oznacza --extended-regexp można znaleźć szczegóły tutaj unix.stackexchange.com/a/17951/196072
      2018-07-25 11: 00: 42Z
    find /path -type f -exec grep -l "string" {} \;
    

    Wyjaśnienie z komentarzy

    find to polecenie, które pozwala znaleźć pliki i inne obiekty, takie jak katalogi i łącza w podkatalogach danej ścieżki. Jeśli nie określisz maski, którą powinny spełniać nazwy plików, wylicza wszystkie obiekty katalogu.

    -type f specifies that it should proceed only files, not directories etc.
    -exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
    
        
    14
    2014-11-26 13: 12: 58Z

    Spróbuj:

    find / -type f -exec grep -H 'text-to-find-here' {} \;
    

    , który przeszuka wszystkie systemy plików, ponieważ / jest folderem głównym.

    Do folderu domowego użyj:

    find ~/ -type f -exec grep -H 'text-to-find-here' {} \;
    

    Do bieżącego folderu użyj:

    find ./ -type f -exec grep -H 'text-to-find-here' {} \;
    
        
    14
    2015-05-09 09: 49: 54Z
    1. Być może szczegóły różnic w folderach są oczywiste dla wielu ... ale także bardzo pomocne dla początkujących. +1
      2016-10-17 18: 07: 09Z
    2. co to dodaje do istniejących odpowiedzi?
      2016-12-02 13: 16: 03Z
    3. Nazwij to moją krucjatą, ale słowo to „katalog”. To nie jest Windows (który i tak używał „katalogu” - pre 9x). Proszę przestać mówić „folder”. Jeśli chodzi o twoje ostatnie polecenie, nie potrzebujesz nawet „/” tylko FYI.
      2018-05-01 23: 12: 12Z

    Mam nadzieję, że to pomoc ...

    Rozszerzając nieco grep, aby podać więcej informacji na wyjściu, na przykład, aby uzyskać numer linii w pliku, w którym znajduje się tekst, można wykonać w następujący sposób:

    find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"
    

    Jeśli masz pomysł, jaki jest typ pliku, możesz zawęzić wyszukiwanie, określając rozszerzenia typu pliku do wyszukania, w tym przypadku .pas OR .dfm pliki:

    find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"
    

    Krótkie wyjaśnienie opcji:

    1. . w find określa from bieżącego katalogu.
    2. -name*.*”: dla wszystkich plików (-name "*.pas" -o -name "*.dfm"): Tylko pliki *.pas OR *.dfm lub OR określone przez -o
    3. -type f określa, że ​​szukasz plików
    4. -print0 i --null po drugiej stronie | (potok) są kluczowymi, przekazując nazwę pliku z find do grep osadzonego w xargs, co pozwala na przekazywanie nazw plików ze spacjami w nazwach plików, co pozwala grep traktować ścieżkę i nazwa pliku jako jeden ciąg, a nie rozbij go na każdą przestrzeń.
    14
    2017-05-25 00: 03: 28Z
    1. -name '*.*' nie jest tym, co mówisz; nie odebrałby pliku o nazwie „plik”, ponieważ wzorzec nie odpowiada temu (brak tekstu); * jednak (dobrze. Pliki na bok). Ale jest jeszcze jedna rzecz: jeśli chcesz wszystkich plików, po co zawracać sobie głowę określaniem nazwy pliku? Nie ma innego komentarza - poza tym miło jest wiedzieć, że wciąż są ludzie, którzy nie używają „folderu” terminologii MS (co naprawdę po dodaniu tego wystarczająco dużo nie dodałbym, ale chciałem zwrócić uwagę na nieco niepoprawne stwierdzenie z nazwami plików - jak również nadmiarowość /bezużyteczność w przypadku „wszystkich”).
      2018-05-01 23: 25: 18Z

    Silver Searcher to wspaniałe narzędzie, ale ripgrep może być jeszcze lepszy.

    Działa na Linuksie, Macu i Windowsie i został napisany na Wiadomościach hakerów . miesięcy temu (ma link do bloga Andrew Gallanta, który ma link GitHub):

    Ripgrep - nowe narzędzie do wyszukiwania wiersza poleceń     

    14
    2017-05-25 00: 10: 37Z

    Prosty find może się przydać. alias w pliku ~/.bashrc:

    alias ffind find / -type f | xargs grep
    

    Uruchom nowy terminal i wydaj:

    ffind 'text-to-find-here'
    
        
    14
    2017-05-25 00: 15: 03Z

    Napisałem skrypt Pythona , który robi coś podobnego. W ten sposób należy użyć tego skryptu.

    ./sniff.py path pattern_to_search [file_pattern]
    

    Pierwszy argument, path, jest katalogiem, w którym będziemy rekurencyjnie szukać. Drugi argument, pattern_to_search, jest wyrażeniem regularnym, które chcemy przeszukać w pliku. Używamy formatu wyrażeń regularnych zdefiniowanego w Pythonie re biblioteka. W tym skrypcie . również pasuje do nowej linii.

    Trzeci argument, file_pattern, jest opcjonalny. Jest to kolejne wyrażenie regularne, które działa na nazwie pliku. Uwzględnione zostaną tylko te pliki, które pasują do tego wyrażenia regularnego.

    Jeśli na przykład chcę wyszukiwać pliki Pythona z rozszerzeniem py zawierającym Pool(, a następnie słowo Adaptor, wykonuję następujące czynności:

    ./sniff.py . "Pool(.*?Adaptor"  .*py
    ./Demos/snippets/cubeMeshSigNeur.py:146 
    ./Demos/snippets/testSigNeur.py:259 
    ./python/moose/multiscale/core/mumbl.py:206 
    ./Demos/snippets/multiComptSigNeur.py:268 
    

    I voila, generuje ścieżkę dopasowanych plików i numer wiersza, w którym znaleziono dopasowanie. Jeśli znaleziono więcej niż jedno dopasowanie, każdy numer linii zostanie dodany do nazwy pliku.

        
    13
    2014-06-30 17: 59: 08Z

    Użyj:

    grep -c Your_Pattern *
    

    Spowoduje to raportowanie, ile kopii twojego wzorca znajduje się w każdym z plików w bieżącym katalogu.

        
    12
    2017-05-25 00: 13: 12Z

    Aby wyszukać ciąg i wypisać tylko ten wiersz z szukanym ciągiem:

    for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done
    

    np .:

    for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done
    

    Aby wyświetlić plik zawierający ciąg wyszukiwania:

    for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
    

    np .:

    for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;
    
        
    11
    2014-01-25 11: 08: 41Z
    1. Widzę tylko minus w porównaniu z użyciem find … -exec grep 'str' {} \; (jeśli w ogóle musisz użyć find).
      2016-10-07 16: 14: 29Z
    2. Byłoby to przerażające, gdyby którykolwiek z plików znalezionych przez find zawierał spacje .. można skończyć grepping błędnymi plikami i /lub całkowicie pominąć właściwe pliki. Wystarczy użyć find ... -exec grep ..., jeśli potrzebujesz użyć find .. ale w tym przypadku wystarczy grep -r ....
      2016-10-11 20: 19: 36Z
    3. jaki jest sens używania pętli wyników wyszukiwania do grep? Jest to niepotrzebnie skomplikowane.
      2016-12-02 13: 17: 45Z

    Istnieje narzędzie ack, które zrobiłoby dokładnie to, czego szukasz.

    http://linux.die.net/man/1/ack

    ack -i search_string folder_path/*
    

    Możesz zignorować -i dla wyszukiwania z uwzględnieniem wielkości liter

        
    11
    2017-07-13 00: 17: 58Z
    1. Co to dodaje do istniejących odpowiedzi? Zasugerowano to już ponad trzy lata temu.
      2016-12-02 13: 20: 15Z
    2. @ fedorqui 1) brak rurociągów! 2) Używaj wyrażeń regularnych 3) Uzyskaj numery linii, nazwę pliku ze ścieżką względną, podświetlony tekst itp. Przydatne do edycji po wyszukiwaniu, np. „Ścieżka vim + lineno /plik.cpp” sprawi, że znajdziesz się w wierszu braku zainteresowania. Zobacz wynik polecenia „ack include | hpp”, który wyszukuje słowa kluczowe „include” lub „hpp” pod moim folderem wyszukiwania i podfolderami. Mam nadzieję, że punkt jest jasny. Oto przykładowy wynik (Nie można wyświetlić słowa kluczowego z prostym tekstem) process /child.hpp 11: boost /process /child.hpp process /all.hpp 21: #include < boost /process /execute.hpp >
      2017-07-11 15: 57: 42Z

    grep jest twoim dobrym przyjacielem, aby to osiągnąć.

    grep -r <text_fo_find> <directory>
    

    jeśli nie interesuje Cię przypadek znalezionego tekstu, użyj

    grep -ir <text_to_find> <directory>
    
        
    11
    2017-10-24 03: 07: 22Z
    1. W moim przypadku wygląda na to, że szuka wszędzie, nawet jeśli podam katalog
      2018-03-20 16: 30: 36Z
    2. @ Pathros Prawdopodobnie ma to związek z włączoną rekursją i określonym katalogiem. Innymi słowy rekursja zmienia rzeczy w ten sposób.
      2018-05-01 23: 38: 17Z
    3. @ Pathros Oh i czy tam jeste dowolny - w ciągu wyszukiwania, który chcesz przekazać -- najpierw grep; co może spowodować interesujące efekty uboczne, inaczej!
      2018-06-02 00: 25: 19Z

    Wszystkie poprzednie odpowiedzi sugerują grep i find. Ale jest inny sposób: użyj Midnight Commander

    Jest to darmowe narzędzie (30 lat, sprawdzone przez czas), które jest wizualne bez GUI. Ma mnóstwo funkcji, a znalezienie plików to tylko jeden z nich.

        
    11
    2019-04-24 15: 28: 42Z
    1. ranger byłby w tym samym pomyśle
      2017-07-12 20: 03: 37Z

    Poniższe polecenie działa poprawnie dla tego podejścia:

    find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
    
        
    10
    2016-02-16 23: 47: 15Z
    1. po co używać find, a następnie grep -r? Są przeznaczone do tego samego, więc jest to zbędne.
      2015-12-23 17: 02: 39Z
    2. ohh !! poprawione, Właściwie to znaleźć grep na filtrowanych plikach i nie wszystkie, dzięki
      2015-12-30 15: 25: 08Z
    3. nadal, to nie ma sensu, możesz filtrować za pomocą find.
      2016-12-03 23: 00: 59Z

    Unikaj kłopotów i instaluj ack-grep. Eliminuje wiele problemów z uprawnieniami i cytatami.

    apt-get install ack-grep
    

    Następnie przejdź do katalogu, który chcesz wyszukać i uruchom poniższe polecenie

    cd /
    ack-grep "find my keyword"
    
        
    10
    2016-03-23 ​​03: 41: 43Z

    Spróbuj tego:

    find . | xargs grep 'word' -sl
    
        
    10
    2017-05-25 00: 02: 19Z
    1. to jest znacznie wolniejsze niż rozwiązanie grep
      2014-12-22 16: 58: 35Z
    2. @ amine Tak, zamiast używać grep bezpośrednio potokuje wszystkie pliki find odnajduje działające xargs grep na nim. Jestem pewien, że to rozumiesz, ale po prostu dodajesz do tych, którzy mogą tego nie robić. Polecenie jest tutaj. Nie mogę sobie wyobrazić dobrej analogii, ale dodaje mnóstwo niepotrzebnych i nieszkodliwych kosztów.
      2018-06-02 01: 34: 08Z

    Jestem zafascynowany tym, jak proste grep robi z 'rl'

    grep -rl 'pattern_to_find' /path/where/to/find
    
    -r to find recursively file / directory inside directories..
    -l to list files matching the 'pattern'
    
      

    Użyj „-r” bez „l”, aby zobaczyć nazwy plików, a po nich tekst, w którym znaleziono wzór !

    grep -r 'pattern_to_find' /path/where/to/find
    

    Działa po prostu idealnie.

    Mam nadzieję, że to pomoże!

        
    10
    2017-09-04 06: 13: 54Z
    1. To także działa w Git Bash (Windows).
      2019-04-24 15: 32: 18Z
    2. Ale oznacza to, że każdy plik musi zostać przeszukany (brak filtru nazwy pliku lub poziomu rozszerzenia pliku, np. .txt). Czy istnieje sposób, aby to zrobić?
      2019-04-24 16: 17: 02Z
źródło umieszczone tutaj