A che serve -exec xargs e -print0?


20

Penso che questi siano i modi più comuni per passare il risultato di un comando al successivo, come input.

Come funzionano questi tre? O quali sono alcuni siti Web / URL?

Risposte:


25

Prime cose da scrivere:

man find

man xargs

Il findcomando stampa i risultati sull'output standard per impostazione predefinita, quindi l' -printopzione normalmente non è necessaria, ma -print0separa i nomi dei file con un byte 0 (NULL) in modo che i nomi contenenti spazi o nuove righe possano essere interpretati correttamente.

L' -execopzione è qualcosa che puoi usare al posto di xargs: il comando find esegue un comando per ogni elemento che trova.

Il xargscomando legge stringhe separate da spazio o newline (in genere dal comando find , ma potrebbero provenire da qualsiasi punto) ed esegue alcuni comandi per ogni stringa.
Se xargs viene eseguito con un'opzione -0 , si aspetterà stringhe NULL separate come output dafind ... -print0

Il vantaggio di xargs è che può raggruppare le stringhe, in modo che esegua un comando solo una o due volte invece di n volte.

Quindi nell'uso normale:

find start_directory -name '*.txt' | xargs ls -l 

find elenca i nomi dei file e xargs emette comandi come:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

che è più veloce rispetto al rilascio del comando find:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt

7

Si noti che xargs non è più necessario con le attuali implementazioni find che probabilmente tutti supportano questa sintassi POSIX:

find directory -name '*.txt' -exec ls -l {} + 

che è più semplice e leggermente più veloce della variante xargs.

find directory -name '*.txt' | xargs ls -l 

xargs utilizza molte meno risorse di "find -exec"
Felipe Alvarez,

7
È il contrario. Il piping su xargs utilizzerà leggermente più risorse di -exec. Probabilmente trascuri il terminatore "+".
jlliagre,

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.