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.