Mit diesem Satz von Befehlen, was sind die {} und \; Zeichen für?Einfache Unix-Befehl, was ist die {} und ; für
find . -name '*.clj' -exec grep -r resources {} \;
Mit diesem Satz von Befehlen, was sind die {} und \; Zeichen für?Einfache Unix-Befehl, was ist die {} und ; für
find . -name '*.clj' -exec grep -r resources {} \;
Siehe man find. (Insbesondere der Teil über -exec
)
Wenn -exec
mit einem Befehl auf jedem der gefundenen Dateien ausgeführt wird, wird die {}
mit dem Namen jeder Datei ersetzt gefunden, und der Befehl von \;
In Ihrem Beispiel: Alle Dateien im aktuellen Verzeichnis (.
), die mit dem Namen *.clj
übereinstimmen, werden mit dem Befehl grep -r resources
ausgeführt (um die Zeichenfolge resources
zu finden, wenn sie in jeder dieser Dateien vorhanden ist).
Es ist eigentlich etwas redundant, da -r
ist für die rekursive Suche nach Unterverzeichnissen, und das ist, was find
bereits tut.
In find, der Parameter -exec packt den Rest der Parameter bis zum; (Semikolon) das entkoppelt werden muss, daher die \ ;. Innerhalb dieser Zeitspanne wird {} durch den zu prüfenden Dateinamen ersetzt.
Die Zeichenfolge "{}" wird durch die aktuelle Datei ersetzt, die gerade verarbeitet wird. Das ausgeblendete Semikolon beendet das Befehlsargument für die Option -exec.
Betrachten Sie diesen alternativen Befehl, den ich leichter verständlich finden:
find . -name *.clj | xargs grep -r resources
Aber was hat den Hauptfehler der unsachgemäßen Umgang mit Dateien mit eingebetteten Leerzeichen und ähnliches. – jlliagre
Der String {}
in find
durch den Pfad der aktuellen Datei ersetzt wird.
Das Semikolon wird zum Beenden des Shell-Befehls verwendet, der vom find
-Dienstprogramm aufgerufen wird.
Es muss maskiert oder zitiert werden, damit es nicht von der Shell interpretiert wird, weil ;
eines der Sonderzeichen ist, die von Shell (Listenoperatoren) verwendet werden.
Siehe auch: Why are the backslash and semicolon required with the find command's -exec option?
Beachten Sie, dass "grep -r" ist nicht erforderlich, es sei denn, diejenigen .clj Dateien Ordner sind. find ist standardmäßig rekursiv, also muss grep nicht sein. (grep wird jeder Datei zugeführt.) Vielleicht möchten Sie auch xargs verwenden, da Sie mit Ihrem aktuellen Befehl nicht erfahren werden, von welchen Dateien Sie die Treffer erhalten. – PEZ