Modo migliore eseguire un comando su ciascun file in un albero di directory


13

Sembra che ci siano molti modi per farlo, inclusi i loop negli script di shell, find e xargs. Quale di questi è il migliore e quale è il più portatile?

Risposte:


13
find . -exec <command> {} \;

per la directory corrente come radice dell'albero o in generale:

find <directory> -exec <command> {} \;

4
su alcuni sistemi find non c'è l'opzione -exec lì puoi usare find. | xargs <Comando>
Hemant,

4
Infatti, e se hai bisogno di filtrare per qualcosa, prova -name "*.c"o ad esempio -type dper le directory ...

Trova può fare cose sorprendentemente complesse - potresti voler controllare la pagina man - unixhelp.ed.ac.uk/CGI/man-cgi?find - per l'elenco completo delle opzioni.
Lucas Jones,

Potresti anche fare attenzione ai nomi dei file con spazi, che potrebbero interrompere l'approccio -exec e xargs. Vedi tinyurl.com/ygvgmw5
Shawn Chin l'

Se possibile, usa il find ... | xargs ...linguaggio, elabora i file in batch e questo sarà generalmente più veloce (meno processi avviati).
vonbrand,

5

Usa l' -print0opzione per trovare e l' -0opzione xargsse hai nomi di file o directory con spazi:

find {dir} -print0 | xargs -0r {command}

L' -print0opzione per trovare stampa i nomi dei file come un NULelenco separato piuttosto che spazi bianchi, mentre l' -0opzione per xargsindicare che interrompe il suo input NULpiuttosto che spazi bianchi. Poiché NULè uno dei caratteri non consentiti nei nomi di file Unix, non è possibile confonderlo con una parte di un nome file.

L' -ropzione è lì in modo che xargsnon ti dia un errore se non ha input.


3

Se la portabilità è un problema, starei lontano dai modi specifici di shell di farlo (ci sono molte persone che usano molte shell diverse, ma in generale find e xargs sono davvero strumenti di base che nessuno oserebbe cambiare in modo radicale) .

L'uso degli argomenti di base di find e xargs dovrebbe darti una soluzione più portatile.


2

Se il raggruppamento di argomenti è accettabile, trova | xargs probabilmente fornirà prestazioni migliori, poiché eseguirà il comando molte meno volte di trovare -exec. Se si desidera eseguire il comando ogni volta per ciascun file o eseguirlo nella sottodirectory del file, è consigliabile utilizzare find -exec o -execdir.

Di norma, è preferibile stare lontano dai loop specifici della shell; find & xargs sono sufficienti per la maggior parte degli scenari.


1

Assicurarsi che la versione del comando che si sta utilizzando non abbia già un flag per l'operazione ricorsiva. :)


0
find [args] -print | xargs {command}

Funziona meglio per me.


2
-1 Non funziona con nomi di file contenenti spazi. Meglio usare find -print0 | xargs -0.
Starblue,
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.