Für die Aufzeichnung ist hier der Ansatz, den ich bevorzuge:
grep pattern $(find . -type f ! -path './test/main.cpp')
grepIch 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 findin einer Befehlsersetzung nur eine Möglichkeit, die (begrenzte) Dateisuchteilmenge der grepFunktionalität von zu erweitern / zu ersetzen .
Für mich ist die find -execSyntax irgendwie arkan. Eine Schwierigkeit find -execist 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 findLösungen zur Verwendung in Skripten : Die grepBefehlszeile 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 grepder nativen Dateisuche (mit der -rOption) nicht erforderlich zu sein scheint .
... Noch besser ist es jedoch, /dev/nullals erste zu durchsuchende Datei einzuschließen. Dies löst zwei Probleme:
- Es stellt sicher, dass bei einer zu durchsuchenden Datei
grepzwei Dateien vorhanden sind und der Ausgabemodus für mehrere Dateien verwendet wird.
- Es stellt sicher, dass, wenn keine zu durchsuchenden Dateien vorhanden sind, angenommen
grepwird, 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.