Für die Aufzeichnung ist hier der Ansatz, den ich bevorzuge:
grep pattern $(find . -type f ! -path './test/main.cpp')
grep
Ich halte das am Anfang des Befehls, was meiner Meinung nach ein wenig klarer ist - außerdem wird die Farbhervorhebung nicht deaktiviert grep
. In gewissem Sinne ist die Verwendung find
in einer Befehlsersetzung nur eine Möglichkeit, die (begrenzte) Dateisuchteilmenge der grep
Funktionalität von zu erweitern / zu ersetzen .
Für mich ist die find -exec
Syntax irgendwie arkan. Eine Schwierigkeit find -exec
ist die (manchmal) Notwendigkeit, verschiedene Zeichen zu maskieren (insbesondere, wenn \;
sie unter Bash verwendet werden). Nur um die Dinge in einen vertrauten Kontext zu bringen, sind die folgenden zwei Befehle im Grunde gleichbedeutend:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Wenn Sie Unterverzeichnisse ausschließen möchten , müssen Sie möglicherweise einen Platzhalter verwenden. Ich verstehe das Schema hier nicht ganz - rede über Arkan :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Ein weiterer Hinweis zur Verallgemeinerung von find
Lösungen zur Verwendung in Skripten : Die grep
Befehlszeile sollte die Option -H
/ enthalten --with-filename
. Andernfalls wird die Ausgabeformatierung geändert, wenn die Suchergebnisse von nur einen Dateinamen enthalten find
. Dies ist bemerkenswert, da es bei Verwendung grep
der nativen Dateisuche (mit der -r
Option) nicht erforderlich zu sein scheint .
... Noch besser ist es jedoch, /dev/null
als erste zu durchsuchende Datei einzuschließen. Dies löst zwei Probleme:
- Es stellt sicher, dass bei einer zu durchsuchenden Datei
grep
zwei Dateien vorhanden sind und der Ausgabemodus für mehrere Dateien verwendet wird.
- Es stellt sicher, dass, wenn keine zu durchsuchenden Dateien vorhanden sind, angenommen
grep
wird, dass eine Datei vorhanden ist, und das Warten auf stdin nicht unterbrochen wird.
Die endgültige Antwort lautet also:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir
) ausschließen möchte . Deshalb möchte ich grep den Ausschluss nativ ausführen lassen.