Risposte:
La differenza di velocità sarà insignificante.
Ma devi assicurarti che:
Il tuo script non presumerà che nessun file abbia spazio, tabulazione, ecc. Nel nome del file; la prima versione è sicura, la seconda no.
Lo script non tratterà un file che inizia con " -
" come un'opzione.
Quindi il tuo codice dovrebbe assomigliare a questo:
find . -exec cmd -option1 -option2 -- {} +
o
find . -print0 | xargs -0 cmd -option1 -option2 --
La prima versione è più breve e più facile da scrivere poiché puoi ignorare 1, ma la seconda versione è più portabile e sicura, poiché " -exec cmd {} +
" è un'opzione relativamente nuova in GNU findutils (dal 2005, molti sistemi in esecuzione non ce l'hanno ancora) e recentemente era pieno di bug . Anche molte persone non lo sanno " -exec cmd {} +
", come puoi vedere da altre risposte.
exec
produrrà risultati non appena vengono trovati, xargs
dove, a quanto pare, aspetterà fino a quando l'intera directory viene cercata prima di scrivere su stdout. Se lo stai provando su una directory di grandi dimensioni e sembra che xargs
non funzioni , è consigliabile pazienza.
-print0
find restituisce nomi di file separati da newline, ma anche newline può essere parte di un nome di file, rendendolo ambiguo. Il byte 0 non può, quindi è un separatore sicuro. Sì, l'aggiunta --
a un comando che lo supporta è una buona pratica quando non è possibile controllare i suoi argomenti, anche se non sempre strettamente necessari o non sicuri.
find . | xargs cmd
è più efficiente (viene eseguito il cmd
minor numero di volte possibile, a differenza di exec
, che viene eseguito cmd
una volta per ogni partita). Tuttavia, ti imbatterai in problemi se i nomi dei file contengono spazi o caratteri stravaganti.
Si suggerisce di utilizzare quanto segue:
find . -print0 | xargs -0 cmd
questo funzionerà anche se i nomi di file contengono caratteri funky ( -print0
marche find
di stampa corrisponda NUL-terminati, -0
marche xargs
aspettano questo formato.)
xargs
approccio è in realtà significativamente più lento se non ci sono (o solo pochi) file corrispondenti e cmd
non ha molto da fare per ogni file. Ad esempio, se eseguita in una directory vuota, la xargs
versione impiegherà almeno il doppio del tempo, poiché devono essere avviati due processi invece di uno solo. (Sì, la differenza di solito è impercettibile su * nix, ma in un ciclo potrebbe essere importante; o, provalo su Windows qualche volta ...)