Quello che hai scritto invia un elenco di nuova riga separata nomi dei file (e percorsi) a rm
, ma rm non sa cosa fare con quell'input. Si aspetta solo i parametri della riga di comando.
xargs
riceve l'input, di solito separate da ritorni a capo, e li pone sulla linea di comando, quindi l'aggiunta di xargs rende ciò che si aveva lavoro:
find . -name .svn | xargs rm -fr
xargs
è abbastanza intelligente che passerà solo come molti argomenti per rm
come può accettare. Quindi, se avessi un milione di file, potrebbe essere eseguito rm
1.000.000/65.000 volte (se la tua shell potrebbe accettare 65.002 argomenti nella riga di comando {65k file + 1 per rm + 1 per -fr}).
Come persone hanno abilmente fatto notare, i seguenti lavori anche:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
I primi due -exec
forme sia chiamare rm
per ogni cartella di essere eliminati, quindi se avete avuto 1.000.000 cartelle, rm
sarebbe invocata 1.000.000 volte .Questo è certamente meno che ideale. Più recenti implementazioni di rm
consentono di concludere il comando con un +
che indica che rm
accetteranno il maggior numero di argomenti possibili:
find . -name .svn -exec rm -rf {} +
dell'ultima ricerca/xargs versione utilizza print0, il che rende trovare generare un output che utilizza \0
come terminatore piuttosto che una nuova riga. Poiché i sistemi POSIX consentono qualsiasi carattere tranne \0
nel nome file, questo è veramente il modo più sicuro per assicurarsi che gli argomenti vengano passati correttamente a rm
o all'applicazione in esecuzione.
Inoltre, c'è un -execdir
che eseguirà rm
dalla directory in cui è stato trovato il file, piuttosto che alla directory di base e di un -depth
che inizierà la profondità prima.
Il comando dovrebbe funzionare se si utilizza 'xargs rm -rf' –
Si potrebbe anche voler modificare il comando di cancellazione "rm -rfi "solo per essere sicuro di voler eliminare le directory. – bedwyr
Non usare xargs però .. avrai problemi con le directory che contengono spazi in esse, ecc. Usa find come descritto di seguito. –