Wie kann ich ein Wort in bestimmten Dateien finden, das einem Muster entspricht? z.B. Suche nach version in CMake* rekursiv im aktuellen Verzeichnis gefundene Dateien.
Akzeptierte Antwort:
Wenn Sie den Dateinamen und die Zeilennummer sehen möchten, POSIXly:
find . -name 'CMake*' -type f -exec grep -nF /dev/null version {} +
(Sie möchten nicht ; verwenden Hier würde ein grep laufen pro Datei). Das ist das Standardäquivalent des GNUism:
find . -name 'CMake*' -type f -print0 | xargs -r0 grep -nHF {} +
find (im ersten), xargs (im zweiten) wird so viele Argumente an grep übergeben wie möglich, ohne die Grenze für die Anzahl der Argumente zu überschreiten, die Sie an einen Befehl übergeben können. Bei dieser Aufteilung konnte es vorkommen, dass beim letzten Durchlauf nur ein Argument an grep übergeben wurde in diesem Fall grep würde den Dateinamen nicht drucken. Deshalb brauchen Sie /dev/null dort (oder -H mit GNU grep ).
Mit -type f , betrachten wir nur normale Dateien (keine Geräte, Symlinks, Pipes, Verzeichnisse…).
Wenn Sie GNUisms verwenden möchten, können Sie GNU grep verwenden Fähigkeit, einen Verzeichnisbaum abzusteigen:
grep -rHnF --include='CMake*' version .
Sie möchten -R nicht verwenden da dies grep verursacht symbolischen Links zu folgen, wenn man den Verzeichnisbaum absteigt und von Geräten, Fifos, Sockets … liest.
Diese Version ist sicherer und effizienter, aber nicht portabel.