Was bedeutet {} + im find -exec-Befehl?

23

Ich möchte die Bedeutung wissen , {} +in dem execBefehl, und was ist der Unterschied zwischen {} +und {} \;. Um genau zu sein, was ist der Unterschied zwischen diesen beiden:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Mohsen
quelle
5
Es ist man find(1)sehr detailliert beschrieben und für jedermann leicht zu finden. Sei nicht faul.
Miroslav Koškár
Danke lieber Miroslav, ich habe reingesucht man exec!
Ah, ich war noch nie auf die {} +Verwendung gestoßen. Ich benutze normalerweise xargs dafür (und oft find ... -print0 | xargs -0 ...)

Antworten:

27

Die Verwendung von ;(Semikolon) oder +(Pluszeichen) ist obligatorisch, um die von -exec/ aufgerufenen Shell-Befehle zu beenden execdir.

Der Unterschied zwischen ;(Semikolon) oder +(Pluszeichen) besteht darin, wie die Argumente an find's -exec/ -execdirparameter übergeben werden. Beispielsweise:

  • using ;führt mehrere Befehle aus (für jedes Argument separat),

    Beispiel:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    Alle folgenden Argumente findgelten als Argumente für den Befehl.

    Die Zeichenfolge {}wird durch den aktuellen Dateinamen ersetzt, der gerade verarbeitet wird.

  • using +führt die geringstmöglichen Befehle aus (da die Argumente miteinander kombiniert werden). Der xargsBefehl funktioniert sehr ähnlich. Daher werden so viele Argumente wie möglich pro Befehl verwendet, um zu vermeiden, dass die maximale Anzahl von Argumenten pro Zeile überschritten wird.

    Beispiel:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    Die Befehlszeile wird erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird.

    {}Innerhalb des Befehls ist nur eine Instanz von zulässig.

Siehe auch:

Kenorb
quelle
Es gibt einen Unterschied und einen großen. Siehe user1116056 Antwort
Jahid
24

Vorausgesetzt, der Befehl find hat weniger als drei Dateien:

fileA
fileB
fileC

Wenn Sie -execmit einem Pluszeichen ( +) verwenden,

find . -type f -exec chmod 775 {} +  

es wird sein:

chmod 775 fileA fileB fileC

Die Befehlszeile wird erstellt, indem jeder übereinstimmende Dateiname am Ende angehängt wird. Dies erfolgt auf die gleiche Weise wie beim xargsErstellen der Befehlszeilen. Die Gesamtzahl der Aufrufe des Befehls ( chmodin diesem Fall) ist viel geringer als die Anzahl der übereinstimmenden Dateien.

Wenn Sie -execmit einem Semikolon ( ;) verwenden,

find . -type f -exec chmod 775 {} \;

es wird sein:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
user1116056
quelle
5

Wie pro man find:

Befehl -exec {} + Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus. Die Befehlszeile wird jedoch erstellt, indem jeder ausgewählte Dateiname am Ende angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile ist in etwa so aufgebaut wie die Befehlszeilen von xargs. Innerhalb des Befehls ist nur eine Instanz von '{}' zulässig. Der Befehl wird im Startverzeichnis ausgeführt.

BE77Y
quelle