Voglio conoscere il significato di {} +
nel exec
e qual è la differenza tra {} +
e {} \;
. Per essere esatti, qual è la differenza tra questi due:
find . -type f -exec chmod 775 {} + find . -type f -exec chmod 775 {} \;
Commenti
Answer
Lutilizzo di ;
(punto e virgola) o +
(segno più) è obbligatorio per terminare i comandi della shell invocati da -exec
/ execdir
.
La differenza tra ;
(punto e virgola) o +
(segno più) è il modo in cui gli argomenti vengono passati a find “s -exec
/ -execdir
parametro. Ad esempio:
-
utilizzando
;
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 per
find
vengono considerati argomenti del comando.La stringa
{}
è sostituito dal nome del file corrente è in fase di elaborazione. -
utilizzando
+
eseguirà il minor numero di comandi possibile (poiché gli argomenti sono combinati insieme). È molto simile al funzionamento del comandoxargs
, quindi utilizzerà quanti più argomenti possibile 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 ogni nome di file selezionato alla fine.
Solo unistanza di
{}
è consentita allinterno del comando.
Vedi anche:
-
man find
- Utilizzo del punto e virgola (;) vs più (+) con exec in find in SO
- Semplice comando unix, qual è il {} and \; for in SO
Comments
- Cè una differenza e una importante. Vedi user1116056 ' s answer
Risposta
Dato che il il comando find ottiene sotto tre file:
fileA fileB fileC
Se utilizzi -exec
con un segno più (+
),
find . -type f -exec chmod 775 {} +
sarà:
chmod 775 fileA fileB fileC
La riga di comando viene creata aggiungendo alla fine ogni nome di file corrispondente, che è nello stesso modo in cui xargs
costruisce 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 utilizzi -exec
con un punto e virgola (;
),
find . -type f -exec chmod 775 {} \;
sarà:
chmod 775 fileA chmod 775 fileB chmod 775 fileC
Risposta
Secondo il man find
:
-exec comando {} + Questo la variante dellazione -exec esegue il comando specificato sui file selezionati, ma la riga di comando viene creata aggiungendo alla fine ogni nome di file selezionato; il numero totale di invocazioni del comando sarà molto inferiore al numero di file corrispondenti. La riga di comando è costruita più o meno nello stesso modo in cui xargs costruisce le sue righe di comando. È consentita una sola istanza di “{}” allinterno del comando. Il comando viene eseguito nella directory iniziale.
man find(1)
in modo molto dettagliato, facilmente reperibile da chiunque. Non ' essere pigro.man exec
!{} +
prima. Normalmente uso xargs per questo (e spessofind ... -print0 | xargs -0 ...
)