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 rmpuò accettare. Quindi, se avessi un milione di file, potrebbe essere eseguito rm1.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 -execmoduli richiedono entrambi rmche ogni cartella venga eliminata, quindi se tu avessi 1.000.000 di cartelle, rmverrebbero invocate 1.000.000 di volte. Questo è sicuramente meno che ideale. Le implementazioni più recenti rmti consentono di concludere il comando con un +indicatore che rmaccetterà 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 \0come terminatore anziché una nuova riga. Poiché i sistemi POSIX consentono qualsiasi carattere tranne \0il nome file, questo è davvero il modo più sicuro per assicurarsi che gli argomenti siano passati correttamente rmo l'applicazione in esecuzione.
Inoltre, c'è un file -execdirche verrà eseguito rmdalla directory in cui è stato trovato il file, piuttosto che dalla directory di base e -depthche inizierà prima in profondità.