Qual è il significato di {} + nel comando -exec di find?


23

Voglio sapere il significato di {} +nel execcomando e qual è la differenza tra {} +e {} \;. Per l'esattezza, qual è la differenza tra questi due:

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

5
È descritto in modo man find(1)molto dettagliato, facilmente reperibile da chiunque. Non essere pigro.
Miroslav Koškár,

Grazie caro Miroslav, ho cercato man exec!

Ah, non avevo mai incontrato {} +prima l' uso. Di solito uso xargs per questo (e spesso find ... -print0 | xargs -0 ...)

Risposte:


27

L'uso di ;(punto e virgola) o +(segno più) è obbligatorio per terminare i comandi della shell richiamati da -exec/ execdir.

La differenza tra ;(punto e virgola) o +(segno più) è il modo in cui gli argomenti vengono passati al parametro find -exec/ -execdir. Per esempio:

  • usando ;eseguirà più comandi (separatamente per ogni argomento),

    Esempio:

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

    Tutti i seguenti argomenti da findconsiderare come argomenti per il comando.

    La stringa {}viene sostituita dal nome del file corrente in fase di elaborazione.

  • usando +eseguirà i comandi meno possibili (poiché gli argomenti sono combinati insieme). È molto simile a come xargsfunziona il comando, quindi utilizzerà il maggior numero possibile di argomenti per comando per evitare di superare il limite massimo di argomenti per riga.

    Esempio:

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

    La riga di comando viene creata aggiungendo alla fine ciascun nome di file selezionato.

    È {}consentita solo un'istanza di all'interno del comando.

Guarda anche:


V'è una differenza e un importante uno. Vedi la risposta di
user1116056

24

Dato che il comando find arriva sotto tre file:

fileA
fileB
fileC

Se si utilizza -execcon un +segno più ( ),

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

sarà:

chmod 775 fileA fileB fileC

La riga di comando viene creata aggiungendo alla fine ciascun nome di file corrispondente, allo stesso modo in cui vengono xargscreate le sue righe di comando. Il numero totale di invocazioni del comando ( chmod, in questo caso) sarà molto inferiore al numero di file corrispondenti.

Se lo usi -execcon un punto e virgola ( ;),

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

sarà:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC

5

Secondo man find:

-exec command {} + Questa variante dell'azione -exec esegue il comando specificato sui file selezionati, ma la riga di comando viene creata aggiungendo alla fine ciascun nome di file selezionato; il numero totale di invocazioni del comando sarà molto inferiore al numero di file corrispondenti. La riga di comando è costruita nello stesso modo in cui xargs costruisce le sue righe di comando. Nel comando è consentita solo un'istanza di '{}'. Il comando viene eseguito nella directory iniziale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.