Wie kann ich mit grep nur Dateinamen unter Linux anzeigen?


1068

Wie kann ich unter grepLinux nur Dateinamen (keine Inline-Übereinstimmungen) anzeigen?

Ich benutze normalerweise so etwas wie:

find . -iname "*php" -exec grep -H myString {} \;

Wie kann ich nur die Dateinamen (mit Pfaden) erhalten, aber ohne die Übereinstimmungen? Muss ich verwenden xargs? Ich habe auf meiner grepManpage keinen Weg gesehen, dies zu tun .


3
Sie wollen die Dateinamen, die mindestens eine Übereinstimmung haben?
Leonbloy

4
Gute Frage. Ich habe damit begonnen, eine Liste der von grep in Vim zurückgegebenen Dateien zu öffnen. vim $(grep -rl Something app/)
David Tuite

1
Sie können Dateien nicht mit dem Befehl grep auflisten. Er wird im Wesentlichen verwendet, um den gewünschten Text aus einer Datei oder einer Liste abzurufen. Zum Beispiel ps aux | grep 'apt-get' oder grep 'text-to-find' / path / to / file /
iamjayp

Antworten:


1625

Die Standardoption grep -l(dh ein Kleinbuchstabe L) könnte dies tun.

Aus dem Unix-Standard :

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

Sie brauchen auch -Hin diesem Fall nicht.


37
Die Dokumentation dieser Option ist (wie so oft in den meisten Man-Dateien) so unklar! Pfff… Erstaunlich, wie der Mensch ein Schmerz im Arsch sein kann.
MonsieurDart

1
-H zeigt auch die Spiele selbst. Die Frage war nur für Dateinamen.
Hauke

@Hauke ​​Und meine Antwort war -l. Ich habe -H nur erwähnt, weil der Befehl des Benutzers in der Frage -H enthielt und es redundant ist, wenn -l angegeben wird.
Random832

2
Schön, ich persönlich benutze dies gerne mit anderen Flags, grep -nrl "some text" .wenn ich rekursiv nach Text in einer Reihe von Unterordnern
suche

142

Von der grep(1)Manpage:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

4
Ein Stopp beim ersten Spiel ist notwendig und Natur.
Thomson

7
Die Dokumentation macht es etwas unklar. "Der Scanvorgang wird bei der ersten Übereinstimmung beendet" - zeigt an, dass alle Dateinamen gedruckt werden, die Suche nach dem übereinstimmenden Wort jedoch beim ersten Auftreten beendet wird.
TheMonkWhoSoldHisCode

2
@VishalP: Da es uns egal ist, wo sich die Vorkommen befinden, nur dass sie existieren, macht es keinen Sinn, jede Datei über das erste Vorkommen hinaus zu durchsuchen.
Ignacio Vazquez-Abrams

17
@ IgnacioVazquez-Abrams Genau. Beim ersten Eindruck des Dokuments haben Sie das Gefühl, dass nur der Dateiname der ersten Datei gedruckt wird. Sie brauchen wirklich ein paar Lesungen, um es zu verstehen.
TheMonkWhoSoldHisCode

5
"Das Scannen der aktuellen Datei wird beim ersten Spiel beendet." wäre viel klarer.
Sorrymissjackson

37

Für eine einfache Dateisuche können Sie grep's -lund -rOptionen verwenden:

grep -rl "mystring"

Die gesamte Suche erfolgt über grep. Wenn Sie Dateien für einen anderen Parameter auswählen müssen, ist find natürlich die richtige Lösung:

find . -iname "*.php" -execdir grep -l "mystring" {} +

Die execdirOption erstellt jeden grep-Befehl pro Verzeichnis und verknüpft Dateinamen zu nur einem Befehl ( +).


0

Ihre Frage Wie kann ich nur die Dateinamen (mit Pfaden) erhalten?

Ihr Syntaxbeispiel finden. -iname "* php" -exec grep -H myString {} \;

Mein Befehlsvorschlag

sudo find /home -name *.php

Die Ausgabe dieses Befehls unter meinem Linux-Betriebssystem:

compose-sample-3 / html / mail / contact_me.php

Viel Spaß, da Sie den Dateinamen mit Pfad benötigen!


In der Frage wird speziell gefragt, wie sie die Dateinamen mit grep erhalten .
Snakecharmerb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.