GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kombiniert man find und grep für eine komplexe Suche? ( GNU/Linux, finden, grep )

Versuchen Sie es

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

Dies sollte die Ordner unter application rekursiv durchsuchen für Dateien mit .php Erweiterung und übergeben Sie sie an grep .

Eine Optimierung hierfür wäre die Ausführung von:

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Dies verwendet xargs um alle .php zu bestehen Dateien, die von find ausgegeben werden als Argumente für einen einzelnen grep Befehl; z. B. grep "debug (" file1 file2 file3 . Die -print0 Option von find und -0 Option von xargs Stellen Sie sicher, dass die Leerzeichen in Datei- und Verzeichnisnamen korrekt behandelt werden. Die -H Option übergeben an grep stellt sicher, dass der Dateiname in allen Situationen gedruckt wird. (Standardmäßig grep gibt den Dateinamen nur aus, wenn mehrere Argumente übergeben werden.)

Von man xargs:

-0

      Eingabeobjekte werden mit einem Nullzeichen anstelle von Leerzeichen abgeschlossen, und die Anführungszeichen und der Backslashare sind nichts Besonderes (jedes Zeichen wird wörtlich genommen). Deaktiviert das Ende der Dateizeichenfolge, das wie jedes andere Argument behandelt wird. Nützlich, wenn Eingabeelemente Leerzeichen, Anführungszeichen oder umgekehrte Schrägstriche enthalten können. Das GNU findet -print0 Option erzeugt Eingaben, die für diesen Modus geeignet sind.


find wird für dieses Beispiel nicht einmal benötigt, man kann grep verwenden direkt (mindestens GNU grep ):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

und wir haben nur noch einen einzigen Prozesszweig.

Optionen:

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

Linux
  1. So verwenden Sie den Befehl „find“, um nach mehreren Dateinamen (Erweiterungen) in Linux zu suchen

  2. So finden Sie eine Datei in Linux

  3. So finden und töten Sie den Zombie-Prozess in Linux

  4. Wie suche ich nach Dateien nach Größe und Erweiterung?

  5. So suchen Sie nach einem Wort im gesamten Inhalt eines Verzeichnisses in Linux

So verwenden Sie den grep-Befehl unter Linux/UNIX

So finden Sie eine Zeichenfolge in einer Datei unter Linux

So finden und löschen Sie defekte Symlinks in Linux

So suchen Sie nach Dateien über die Linux-Befehlszeile

So finden und löschen Sie leere Verzeichnisse in Linux

So finden Sie den Namen und die Version der Linux-Distribution