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?
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:
find . -exec <command> {} \;
per la directory corrente come radice dell'albero o in generale:
find <directory> -exec <command> {} \;
-name "*.c"
o ad esempio -type d
per le directory ...
find ... | xargs ...
linguaggio, elabora i file in batch e questo sarà generalmente più veloce (meno processi avviati).
Usa l' -print0
opzione per trovare e l' -0
opzione xargs
se hai nomi di file o directory con spazi:
find {dir} -print0 | xargs -0r {command}
L' -print0
opzione per trovare stampa i nomi dei file come un NUL
elenco separato piuttosto che spazi bianchi, mentre l' -0
opzione per xargs
indicare che interrompe il suo input NUL
piuttosto 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' -r
opzione è lì in modo che xargs
non ti dia un errore se non ha input.
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.
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.
Assicurarsi che la versione del comando che si sta utilizzando non abbia già un flag per l'operazione ricorsiva. :)