Know How - Scripting - Shell

Such-Kommando via find

2008-07-02: Aus gegebenem Anlass (weil mich gerade ein Kollege fragte):
find . -name '*.txt' -exec grep -l "Suchtext" {} \;
ist zwar nicht ganz effizient, aber die effizientere (und sicherere) Variante geht eigentlich nur unter Linux:
find . -name '*.txt' -print0 | xargs --null -- grep -l "Suchtext" --

Hinweise dazu:
  • Das "-l" (Minus Ell) sorgt dafür, dass nur die Dateinamen ausgegeben werden.
  • Das "-print0" in Kombination mit --null sorgt dafür, dass alle Dateinamen funktionieren, also auch solche, die z. B. ein Leerzeichen oder gar ein Linefeed enthalten (das geht unter Unix!)
  • Diese "--" sorgen gemäß POSIX dafür, dass die Argumente dem richtigen Kommando zugeordnet werden. In diesem Fall könnte man auch Dateinamen suchen, die mit einem "-" beginnen (was an sich nicht klappt, da der Find-Pfad ja nicht mit einem - beginnen kann. Aber man könnte unter Linux ja Pfade mit der find-Option -printf zusammenbauen).
  • xargs kann - traditionell - nicht mit Dateinamen umgehen, die ein Leerzeichen enthalten, da jeder Whitespace den Dateinamen trennt. Deshalb ist das nicht-GNU-xargs unter Standard-Unix in Situationen mit "find" ziemlich fehlerträchtig und sollte besser nicht in Scripten verwendet werden, die mit beliebigen Pfadnamen/Dateinamensresultaten gefüttert werden können.