Uma das missões de uma ferramenta de exportação que tenho no meu aplicativo é limpar todos os .svn
diretórios da minha árvore de diretórios do aplicativo. Estou procurando um comando recursivo no shell do Linux que percorra a árvore inteira e exclua os .svn
arquivos.
Não estou usando exportação, pois esse script será usado para outros nomes de arquivos / diretórios que não estão relacionados ao SVN. Eu tentei algo como:
find . -name .svn | rm -fr
Não deu certo ...
Respostas:
Tente o seguinte:
Antes de executar um comando como esse, geralmente gosto de executar isso primeiro:
fonte
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
faz?ls
, receboentries prop-base props text-base tmp
saída ...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:xargs
é inteligente o suficiente para transmitir apenas o maior número de argumentosrm
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:
Os dois primeiros
-exec
formulários chamamrm
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 derm
permitem concluir o comando com uma+
indicação querm
aceitará o maior número possível de argumentos: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 arm
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.fonte
Não há necessidade de pipes, xargs, exec ou qualquer coisa:
Edit: Brincadeirinha, evidentemente
-delete
chama porunlinkat()
baixo do capô, por isso se comporta comounlink
ourmdir
e se recusará a operar em diretórios contendo arquivos.fonte
-delete
não tocará em um diretório se ele contiver arquivos.-force
sinalizador recursivo ou nenhum para-delete
predicado, portanto, essa resposta é inútil. Assim, ele está de volta para|xargs rm -rf
, que é menos feio para digitar, em seguida,-exec
com os seus espaços reservados feias e vírgula:-exec rm -rf '{}' \;
.Já existem muitas respostas fornecidas para excluir o diretório .svn. Mas quero acrescentar que você pode evitar esses diretórios desde o início, se fizer uma exportação em vez de uma finalização da compra:
fonte
Se você não gosta de ver muitas
avisos e use o
-depth
comutador:fonte
No Windows, você pode usar o seguinte script do Registro para adicionar "Excluir pastas SVN" ao menu de contexto do botão direito do mouse. Execute-o em qualquer diretório que contenha esses arquivos desagradáveis.
fonte
Você quase teve. Se você deseja passar a saída de um comando como parâmetros para outro, precisará usar xargs. A adição
-print0
garante que o script possa manipular caminhos com espaço em branco:fonte
fonte
Como uma questão importante, quando você deseja utilizar o shell para excluir pastas .svn, você precisa do argumento -thpth para evitar que o comando find entre no diretório que acabou de ser excluído e mostre mensagens de erro como, por exemplo,
Como resultado, você pode usar o comando find, como abaixo:
fonte
Tente o seguinte:
Leia mais sobre o comando find no developerWorks .
fonte
Como alternativa, se você deseja exportar uma cópia sem modificar a cópia de trabalho, pode usar o rsync:
fonte