Da man find
:
comando -exec;
Esegui comando; vero se viene restituito lo stato 0. Tutti i seguenti argomenti da trovare sono considerati argomenti per il comando fino a quando un argomento costituito da ';' è stato incontrato. La stringa '{}' è sostituita dal nome del file corrente che viene elaborato ovunque si presenti negli argomenti al comando, non solo negli argomenti in cui è solo, come in alcune versioni di find. È possibile che entrambe queste costruzioni debbano essere salvate (con un '\') o quotate per proteggerle dall'espansione della shell. Vedere la sezione ESEMPI sec per esempi sull'uso dell'opzione '-exec'. Il comando specificato viene eseguito una volta per ogni file corrispondente.
Il comando viene eseguito nella directory iniziale. Ci sono inevitabili problemi di sicurezza nell'uso dell'opzione -exec;
-exec comando {} +
Questa variante dell'opzione -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.
Quindi, per come lo capisco, \;
esegue un comando separato per ogni file trovato da find
, mentre \+
accoda i file ed esegue un singolo comando su tutti. Il \
è un carattere di escape, quindi è:
ls testdir1; ls testdir2
vs
ls testdir1 testdir2
Fare quanto sopra nella mia shell ha rispecchiato l'output nella tua domanda.
esempio di quando vorresti usare \+
Supponi due file 1.tmp
e 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
Con \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Considerando che se si utilizza \+
(per concatenare i risultati di find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
Quindi in questo caso è la differenza tra diff 1.tmp; diff 2.tmp
ediff 1.tmp 2.tmp
Ci sono casi in cui \;
è appropriato e \+
sarà necessario. L'utilizzo \+
con rm
è uno di questi casi, in cui se si rimuove un numero elevato di file le prestazioni (velocità) saranno superiori \;
.