
Bitte hat jemand eine Idee über die Ausgabe dieses Befehls? Ich habe viel darüber gegoogelt, aber ich kann nichts Nützliches finden
find . -type f -exec grep -H PATH {} \;
Dank im Voraus
Antwort1
Der Befehl
find . -type f -exec grep -H PATH {} \;
findet alle regulären Dateien ( -type f
) im aktuellen Verzeichnis ( .
) oder darunter und führt für jede dieser Dateien grep -H PATH {}
mit aus {}
, wobei „ durch den vollständigen Pfadnamen der Datei relativ zum aktuellen Verzeichnis ersetzt wird.“
Die -H
Option to grep
ist nicht standardmäßig, wird aber häufig implementiert und stellt sicher, dass jeder übereinstimmenden Zeile der Pfadname der Datei vorangestellt wird, in der die Zeile gefunden wurde. Sie können den Befehl grep PATH /dev/null {}
stattdessen in ändern, um zu erzwingen, grep
dass immer der Pfadname der Datei ausgegeben wird, die die übereinstimmenden Zeilen enthält (standardmäßig grep
geschieht dies, wenn in der Befehlszeile mindestens zwei Dateien angegeben sind).
Das verwendete Muster grep
ist die Zeichenfolge PATH
.
Zusammenfassend: Der Befehl findet und gibt alle Zeilen aus allen regulären Dateien im aktuellen Verzeichnis oder darunter aus, die den Teilstring PATH
irgendwo erwähnen. Jeder Zeile ist der Pfadname der Datei vorangestellt, die die Zeile enthält.
Ein Ausschnitt der Ausgabe, die ich erhalte, wenn ich dies in meinem persönlichen Home-Verzeichnis ausführe:
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_NM:FILEPATH=/usr/bin/nm
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_SKIP_RPATH:BOOL=NO
./Documents/Pathfinder/build/CMakeCache.txt:CMAKE_STRIP:FILEPATH=/usr/bin/strip
Der Befehl könnte effizienter gestaltet werden, indem man grep
ihn in Stapeln auf möglichst viele Dateien gleichzeitig ausführt, statt einmal für jede Datei:
find . -type f -exec grep -F -e PATH /dev/null {} +
grep
Ich habe mir auch die Freiheit genommen, den Befehl hier leicht zu ändern, indem ich hinzugefügt habe -F
, dass er die Zeichenfolge PATH
alsSchnurund nicht als regulärer Ausdruck. Die -e
Option wird nur verwendet, um anzugeben, dass das nächste Argument das Muster ist (nützlich, wenn das Muster später in etwas geändert wird, das beispielsweise mit einem Bindestrich beginnt).
Es ist die Änderung von \;
„zu“ +
am Ende des -exec
Prädikatarguments, die dazu führt, dass die gefundenen Pfadnamen in Stapeln gesammelt werden, anstatt das Dienstprogramm für jeden einzelnen auszuführen.