2009-10-19 13 views
11

sto cercando di scrivere un comando bash che elimina tutti i file che corrispondono a un modello specifico - in questo caso, si tratta di tutti i file di log vmware vecchi che si sono accumulati.Shell Scripting: Utilizzo bash con xargs

Ho provato questo comando:

find . -name vmware-*.log | xargs rm 

Tuttavia, quando si esegue il comando, soffoca su tutte le cartelle che hanno spazi nei loro nomi. Esiste un modo per formattare il percorso del file in modo che xargs lo trasmetta a rm quotato o correttamente scappato?

+0

Croce ha scritto: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

risposta

24

utilizzare:

find . -name vmware-*.log -print0 | xargs -0 rm 

Questo fa sì che trovare per produrre un carattere null dopo ogni nome del file e dice xargs per rompere nomi basati su caratteri null al posto di spazi o di altri token.

5

Partenza bandiera -0 per xargs; combinato con -print0 si dovrebbe essere impostato find s'.

find . -name vmware-*.log -print0 | xargs -0 rm 
9

Non utilizzare xargs. Trova può farlo senza alcun aiuto:

find . -name "vmware-*.log" -exec rm '{}' \;

+3

E 'sempre bene per evitare di iniziare un processo extra, specialmente qualcosa di simile in cui potresti fornire qualcosa di troppo lungo a xargs. Nota che 'find' ha anche un'azione' delete' che puoi usare al posto di '-exec ...' - ma è più facile personalizzarla in questo modo. Non devi nemmeno citare le parentesi graffe, a meno che tu non stia usando una vecchia shell come tcsh. – Cascabel

+3

Ma questo lancerà un processo di 'rm' per ogni singolo file, invece di passare parecchi nomi di file a' rm' come 'xargs' lo fa, in modo che sarà più lento. – JaakkoK

+5

@jk: Ecco perché più recenti implementazioni 'find' hanno' trovare rm -exec '{}' + ', che sarà in batch fino argomenti, proprio come' xargs' fa. – ephemient

4

GNU trovare

find . -name vmware-*.log -delete 
1

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

uso -iname per la ricerca modello

0

Per evitare problema di spazio in xargs I usare il carattere della nuova riga come sep Arator con l'opzione -d:

find . -name vmware-*.log | xargs -d '\n' rm 
Problemi correlati