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 rm
possí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 -exec
formulários chamam rm
a exclusão de cada pasta, portanto, se você tivesse 1.000.000 de pastas, rm
seria invocado 1.000.000 de vezes. Isso certamente é menos que o ideal. As implementações mais recentes de rm
permitem concluir o comando com uma +
indicação que rm
aceitará 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 \0
como um terminador em vez de uma nova linha. Como os sistemas POSIX permitem qualquer caractere, exceto \0
o 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 -execdir
que será executado a rm
partir do diretório em que o arquivo foi encontrado, em vez de no diretório base e um -depth
que iniciará a profundidade primeiro.