Frage Wie finde ich alle Dateien, die bestimmten Text unter Linux enthalten?


Ich versuche einen Weg zu finden, mein gesamtes Linux-System nach allen Dateien zu durchsuchen, die eine bestimmte Textfolge enthalten. Nur um klar zu stellen, suche ich nach Text innerhalb der Datei, nicht nach dem Dateinamen.

Als ich nachgeschaut habe, wie ich das mache, bin ich zweimal auf diese Lösung gestoßen:

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

Es funktioniert jedoch nicht. Es scheint, jede einzelne Datei im System anzuzeigen.

Ist das nahe am richtigen Weg? Wenn nicht, wie soll ich? Diese Fähigkeit, Textzeichenfolgen in Dateien zu finden, wäre für einige Programmierprojekte, die ich mache, außerordentlich nützlich.


3677
2018-06-06 08:06


Ursprung


Antworten:


Mach Folgendes:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r oder -R ist rekursiv,
  • -n ist Zeilennummer und
  • -w steht für das ganze Wort.
  • -l (Kleinbuchstaben L) kann hinzugefügt werden, um nur den Dateinamen der übereinstimmenden Dateien anzugeben.

Zusammen mit diesen --exclude, --include, --exclude-dir Flags könnten für eine effiziente Suche verwendet werden:

  • Dadurch werden nur Dateien mit den Erweiterungen .c oder .h durchsucht:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Dies schließt das Durchsuchen aller Dateien mit der Endung .o aus:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Bei Verzeichnissen ist es möglich, ein bestimmtes Verzeichnis (e) durch zu schließen --exclude-dir Parameter. Dies schließt zum Beispiel die Verzeichnisse dir1 /, dir2 / aus, die alle mit * .dst / übereinstimmen:

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

Das funktioniert sehr gut für mich, um fast den gleichen Zweck wie deinen zu erreichen.

Für weitere Optionen überprüfen man grep.


6648
2018-06-06 08:21



Sie können verwenden grep -ilR:

grep -Ril "text-to-find-here" /
  • i steht für "Ignorieren" (in Ihrem Fall optional).
  • R steht für rekursiv.
  • l steht für "Zeige den Dateinamen, nicht das Ergebnis selbst".
  • / steht für den Start an der Wurzel Ihrer Maschine.

1085
2018-06-06 08:08



Sie können verwenden ack. Es ist wie Grep für den Quellcode. Sie können damit Ihr gesamtes Dateisystem scannen.

Mach einfach:

ack 'text-to-find-here'

In deinem Wurzelverzeichnis.

Sie können auch verwenden Reguläre Ausdrücke, geben Sie den Dateityp usw. an


AKTUALISIEREN

Ich habe es gerade entdeckt Der Silberne Sucher, die wie Ack aber 3-5x schneller ist als es und ignoriert sogar Muster von a .gitignore Datei.


232
2018-06-06 08:26



Sie können verwenden:

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

Das r steht für rekursiv und sucht daher im angegebenen Pfad und auch seinen Unterverzeichnissen. Dies teilt Ihnen den Dateinamen mit und gibt die Zeile in der Datei aus, in der die Zeichenfolge angezeigt wird.

Oder ein Befehl ähnlich dem, den Sie versuchen (Beispiel:) für die Suche in allen Javascript-Dateien (* .js):

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

Dadurch werden die Zeilen in den Dateien gedruckt, in denen der Text angezeigt wird. Der Dateiname wird jedoch nicht gedruckt.

Zusätzlich zu diesem Befehl können wir dies auch schreiben: grep -rn "Zu durchsuchende Zeichenfolge" / Pfad / zu / Verzeichnis / oder / Datei -r: rekursive Suche n: Zeilennummer wird für Übereinstimmungen angezeigt


125
2018-03-14 23:29



Sie können dies verwenden:

grep -inr "Text" folder/to/be/searched/

83
2017-07-31 13:44



Liste der Dateinamen, die einen bestimmten Text enthalten

Vor allem glaube ich, dass du es benutzt hast -H Anstatt von -l. Sie können auch versuchen, den Text in Anführungszeichen hinzuzufügen, gefolgt von {} \.

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

Beispiel

Nehmen wir an, Sie suchen nach Dateien, die einen bestimmten Text "Apache License" in Ihrem Verzeichnis enthalten. Es werden Ergebnisse ähnlich wie unten angezeigt (die Ausgabe unterscheidet sich je nach Inhalt des Verzeichnisses).

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$ 

Entfernen Sie Groß- / Kleinschreibung

Auch wenn Sie nicht über den Fall wie "Text" vs "TEXT" verwenden, können Sie die verwenden -i Schalter um Groß- / Kleinschreibung zu ignorieren. Sie können weitere Details lesen Hier.

Hoffe das hilft dir.


48
2017-11-09 13:18



Wenn dein grep rekursive Suche nicht unterstützt, können Sie kombinieren find mit xargs:

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

Ich finde das leichter zu merken als das Format für find -exec.

Dies gibt den Dateinamen und den Inhalt der übereinstimmenden Zeile aus, z.

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

Optionale Flags, die Sie möglicherweise hinzufügen möchten grep:

  • -i - Suche ohne Berücksichtigung der Groß- und Kleinschreibung
  • -l - Gib nur den Dateinamen aus, wo die Übereinstimmung gefunden wurde
  • -h - gib nur die übereinstimmende Zeile aus (nicht den Dateinamen)

46
2018-06-20 08:49



grep -insr "pattern" *
  • i: Ignoriere Fallunterscheidungen sowohl im PATTERN als auch in den Eingabedateien.
  • n: Präfix jeder Zeile der Ausgabe mit der 1-basierten Zeilennummer in der Eingabedatei.
  • s: Unterdrücken Fehlermeldungen über nicht vorhandene oder nicht lesbare Dateien.
  • r: Liest alle Dateien rekursiv unter jedem Verzeichnis ein.

34
2018-02-26 05:47



grep (GNU oder BSD)

Sie können verwenden grep Werkzeug zum rekursiven Durchsuchen des aktuellen Ordners, wie:

grep -r "class foo" .

Hinweis: -r - Durchsuchen Sie Unterverzeichnisse rekursiv.

Sie können die Globbing-Syntax auch verwenden, um in bestimmten Dateien zu suchen:

grep "class foo" **/*.c

Hinweis: Durch Verwendung von Globbing-Option (**), scannt er alle Dateien rekursiv mit einer bestimmten Erweiterung oder einem bestimmten Muster. Um diese Syntax zu aktivieren, führen Sie Folgendes aus: shopt -s globstar. Sie können auch verwenden **/*.* für alle Dateien (außer versteckt und ohne Erweiterung) oder irgendein anderes Muster.

Wenn Sie den Fehler haben, dass Ihr Argument zu lang ist, sollten Sie Ihre Suche einschränken oder verwenden find Syntax stattdessen wie:

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

Alternativ verwenden ripgrep.

ripgrep

Wenn Sie an größeren Projekten oder großen Dateien arbeiten, sollten Sie verwenden ripgrep stattdessen, wie:

rg "class foo" .

Überprüfen Sie die Dokumentation, die Installationsschritte oder den Quellcode auf dem GitHub Projektseite.

Es ist viel schneller als jedes andere Werkzeug wie GNU/BSD  grep, ucg, ag, sift, ack, pt oder ähnlich, da es auf Rosts Regex-Engine die endliche Automaten, SIMD und aggressive wörtliche Optimierungen verwendet, um die Suche sehr schnell zu machen.

Es unterstützt Ignoriermuster, die in angegeben sind .gitignore Dateien, so dass ein einzelner Dateipfad gleichzeitig mit mehreren Glob-Mustern verglichen werden kann.


Sie können die allgemeinen Parameter verwenden wie:

  • -i - Unsensitives Suchen.
  • -I - Ignoriere die Binärdateien.
  • -w - Suchen Sie nach den ganzen Wörtern (im Gegensatz zur Teilwortübereinstimmung).
  • -n - Zeigen Sie die Linie Ihres Spiels.
  • -C/--context (z.B. -C5) - Erhöht den Kontext, so dass Sie den umgebenden Code sehen.
  • --color=auto - Markieren Sie den passenden Text.
  • -H - Zeigt den Dateinamen an, wo der Text gefunden wurde.
  • -c - Zeigt die Anzahl der übereinstimmenden Zeilen an. Kann mit kombiniert werden -H.

29
2018-05-09 10:11



Versuchen:

find . -name "*.txt" | xargs grep -i "text_pattern"

24
2017-12-10 05:47



Benutzen pwd von jedem Verzeichnis aus, in dem Sie sich befinden, rekursiv nach unten

grep -rnw `pwd` -e "pattern"

Aktualisieren Abhängig von der Version von grep, die Sie verwenden, können Sie weglassen pwd. Auf neueren Versionen . scheint der Standardfall für grep zu sein, wenn kein Verzeichnis angegeben wird so:

grep -rnw -e "pattern" 

oder

grep -rnw "pattern" 

werde dasselbe tun wie oben!


22
2018-05-28 12:47