it-swarm.com.de

Was macht "{} \;" meine in einem Linux-Befehl?

Manchmal sehe ich den folgenden Befehl:

find . -name  * -exec ls -a {} \;

Ich wurde gebeten, dies auszuführen.

Was bedeutet {} \; hier?

36
codeofnode

Wenn Sie find mit exec ausführen, wird {} auf den Dateinamen jeder mit find gefundenen Datei oder jedes mit ls gefundenen Verzeichnisses erweitert, sodass ls in Ihrem Beispiel gefunden wird Dateiname als Argument - Beachten Sie, dass exec oder ein anderer Befehl aufgerufen wird, den Sie für jede gefundene Datei einmal angeben.

Das Semikolon ; beendet den von find ausgeführten Befehl. Es muss mit \ maskiert werden, damit die Shell, die Sie find ausführen, es nicht als eigenes Sonderzeichen behandelt, sondern es an find weitergibt.

Siehe dieser Artikel für weitere Details.


Außerdem bietet find eine gewisse Optimierung mit exec cmd {} + - Wenn ls so ausgeführt wird, werden gefundene Dateien an das Ende des Befehls angehängt, anstatt sie einmal pro Datei aufzurufen (damit der Befehl ausgeführt wird) nur einmal, wenn möglich).

Der Unterschied im Verhalten (wenn nicht in der Effizienz) ist leicht bemerkbar, wenn mit jpg ausgeführt wird, z.

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

Angenommen, Sie haben ls Dateien (mit ausreichend kurzen Pfaden ). Das Ergebnis ist eine Zeile pro Datei im ersten Fall und Standard _ (VARIABLE) ) _ Verhalten beim Anzeigen von Dateien in Spalten für letztere.

46
moon.musick

Von der Manpage für den find Befehl Manpage icon :

-exec command ;
              Execute  command;  true if 0 status is returned.  All following arguments to find are taken to be arguments to
              the command until an argument consisting of `;' is encountered.  The string `{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  `\')  or
              quoted  to  protect them from expansion by the Shell.

Also hier ist die Erklärung:

{} bedeutet "die Ausgabe von find". Wie in "was auch immer find gefunden". find gibt den Pfad der gesuchten Datei zurück, oder? Also ersetzt {} es; Es ist ein Platzhalter für jede Datei, die der Befehl find findet (entnommen aus hier ).

Der Teil \; sagt find "Okay, ich bin mit dem Befehl fertig, den ich ausführen wollte".

Beispiel:

Angenommen, ich befinde mich in einem Verzeichnis voller .txt Dateien. Ich laufe dann:

find . -name  '*.txt' -exec cat {} \;

Der erste Teil, find . -name *.txt, gibt eine Liste der .txt -Dateien zurück. Der zweite Teil, -exec cat {} \;, führt den Befehl cat für jede von find gefundene Datei aus, also cat file1.txt, cat file2.txt und so weiter.

20
Alaa Ali