O que você escreveu envia uma lista de nomes de arquivos separados por nova linha (e caminhos) rm, mas a rm não sabe o que fazer com essa entrada. Espera apenas parâmetros de linha de comando.
xargs recebe entrada, geralmente separada por novas linhas, e as coloca na linha de comando; portanto, adicionar xargs faz com que você trabalhe:
find . -name .svn | xargs rm -fr
xargsé inteligente o suficiente para transmitir apenas o maior número de argumentos rmpossível. Portanto, se você tivesse um milhão de arquivos, ele pode ser executadorm 1.000.000 / 65.000 vezes (se seu shell puder aceitar 65.002 argumentos na linha de comando {65k arquivos + 1 para rm + 1 para -fr}).
Como as pessoas apontaram habilmente, o seguinte também funciona:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Os dois primeiros -execformulários chamam rma exclusão de cada pasta, portanto, se você tivesse 1.000.000 de pastas, rmseria invocado 1.000.000 de vezes. Isso certamente é menos que o ideal. As implementações mais recentes de rmpermitem concluir o comando com uma +indicação que rmaceitará o maior número possível de argumentos:
find . -name .svn -exec rm -rf {} +
A última versão find / xargs usa print0, o que faz com que find gerar saída que use \0como um terminador em vez de uma nova linha. Como os sistemas POSIX permitem qualquer caractere, exceto \0o nome do arquivo, esta é realmente a maneira mais segura de garantir que os argumentos sejam passados corretamente pararm ou que o aplicativo esteja sendo executado.
Além disso, há um -execdirque será executado a rmpartir do diretório em que o arquivo foi encontrado, em vez de no diretório base e um -depthque iniciará a profundidade primeiro.