2009-01-15 8 views
10

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 {} \; 
+1

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

Antwort

21

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 \;

beendet wird

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.

2

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.

1

Die Zeichenfolge "{}" wird durch die aktuelle Datei ersetzt, die gerade verarbeitet wird. Das ausgeblendete Semikolon beendet das Befehlsargument für die Option -exec.

2

Betrachten Sie diesen alternativen Befehl, den ich leichter verständlich finden:

find . -name *.clj | xargs grep -r resources 
+1

Aber was hat den Hauptfehler der unsachgemäßen Umgang mit Dateien mit eingebetteten Leerzeichen und ähnliches. – jlliagre

0

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?

Verwandte Themen