Einer meiner Lieblings-BASH-Befehle ist:
find . -name '*.*' -exec grep 'SearchString' {} /dev/null \;
Durchsucht den Inhalt aller Dateien im und unterhalb des aktuellen Verzeichnisses nach dem angegebenen SearchString. Als Entwickler hat sich dies manchmal als nützlich erwiesen.
Aufgrund meines aktuellen Projekts und der Struktur meiner Codebasis möchte ich diesen BASH-Befehl jedoch noch weiter ausbauen, indem ich keine Dateien in oder unter einem Verzeichnis suche, das ".svn" enthält, oder Dateien, die ".svn" enthalten ende mit ".html"
Die MAN-Seite verwirrte mich allerdings. Ich habe versucht, -prune zu verwenden, und es hat mich seltsam verhalten. Bei dem Versuch, nur die HTML-Seiten zu überspringen (um zu beginnen), habe ich Folgendes versucht:
find . -wholename './*.html' -prune -exec grep 'SearchString' {} /dev/null \;
und habe nicht das Verhalten bekommen, auf das ich gehofft hatte. Ich glaube, ich verpasse möglicherweise den Punkt -Prune. Könnt ihr mir helfen?
Vielen Dank
grep -rl 'SearchString'
find
zum Suchen in einer Datei verwendet wird.
-name '*.*'
findet nicht alle Dateien: nur die mit einem .
in ihrem Namen (die Verwendung von *.*
ist normalerweise ein DOS-Ismus, während Sie in Unix normalerweise nur *
dafür verwenden). Um wirklich passen sie alle, entfernen Sie einfach das Argument zusammen: find . -exec ...
. Oder wenn Sie grep nur auf Dateien anwenden möchten (und Verzeichnisse überspringen möchten), dann tun Sie dies find . -type f -exec ...
.
find
ist kein integrierter Bash-Befehl, sondern ein separates Programm