Quello che hai scritto invia un elenco di nomi (e percorsi) di file separati da una nuova riga rm
, ma rm non sa cosa fare con quell'input. Si aspetta solo parametri dalla riga di comando.
xargs
accetta input, generalmente separati da newline, e li posiziona sulla riga di comando, quindi l'aggiunta di xargs fa funzionare ciò che avevi:
find . -name .svn | xargs rm -fr
xargs
è abbastanza intelligente da passare solo quanti più argomenti rm
può accettare. Quindi, se avessi un milione di file, potrebbe essere eseguito rm
1.000.000 / 65.000 volte (se la tua shell potesse accettare 65.002 argomenti sulla riga di comando {65k file + 1 per rm + 1 per -fr}).
Come hanno sottolineato abilmente le persone, anche i seguenti funzionano:
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
moduli richiedono entrambi rm
che ogni cartella venga eliminata, quindi se tu avessi 1.000.000 di cartelle, rm
verrebbero invocate 1.000.000 di volte. Questo è sicuramente meno che ideale. Le implementazioni più recenti rm
ti consentono di concludere il comando con un +
indicatore che rm
accetterà il maggior numero di argomenti possibile:
find . -name .svn -exec rm -rf {} +
L'ultima versione di find / xargs utilizza print0, il che rende find generare output che utilizza \0
come terminatore anziché una nuova riga. Poiché i sistemi POSIX consentono qualsiasi carattere tranne \0
il nome file, questo è davvero il modo più sicuro per assicurarsi che gli argomenti siano passati correttamente rm
o l'applicazione in esecuzione.
Inoltre, c'è un file -execdir
che verrà eseguito rm
dalla directory in cui è stato trovato il file, piuttosto che dalla directory di base e -depth
che inizierà prima in profondità.