Emito o seguinte comando para encontrar os diretórios .svn:
find . -name ".svn"
Isso me dá os seguintes resultados:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
Como eu poderia processar todas essas linhas rm -fr
para excluir os diretórios e seu conteúdo?
find
rm
subversion
Arnaud
fonte
fonte
-delete
opção.-exec rm -r "{}" \;
ao final da descoberta - tenha cuidado ao usarrm -r
! :)-name ".svn"
, corresponde apenas ao.svn
diretório em si e não aos arquivos localizados no.svn
diretório.-exec
com citado"{}"
).Respostas:
O Find pode executar argumentos com a
-exec
opção para cada correspondência encontrada. É um mecanismo recomendado porque você pode manipular caminhos com espaços / novas linhas e outros caracteres neles corretamente. Você precisará excluir o conteúdo do diretório antes de poder removê-lo, portanto, use-r
com orm
comando para conseguir isso.Para o seu exemplo, você pode emitir:
Você também pode dizer ao find para encontrar apenas os diretórios denominados .svn adicionando uma
-type d
verificação:Aviso Use
rm -r
com cuidado para excluir a pasta e todo o seu conteúdo.Se você deseja excluir apenas diretórios vazios e diretórios que contêm apenas diretórios vazios, o find pode fazer isso sozinho com
-delete
e-empty
:fonte
-type
atrás-name
nos comandos find, pois as chamadasstat
para obter o tipo são caras. Eu mesmo tentei em um monte de arquivos bastante grande e parece verdade: a execuçãofind . -name 'foo' -type d
levou 19 segundos efind . -type d -name 'foo'
32 segundos. Portanto, cerca de 50% mais tempo para executar-type
primeiro.find
quer ver nessa pasta outras correspondências, enquanto remove a pasta ao mesmo tempo. ~ Eu não sei ainda como consertar isso ~ correção sujo:.find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
-depth
correções argumento isto:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
Aqui está um portátil ainda mais rápido que o modo de resposta aceito.
O uso
+
de um ponto e vírgula comofind
terminador de comando está otimizando o uso da CPU. Isso pode ser significativo se você tiver muitos.svn
subdiretórios:Note também que você nunca 1 necessidade de citar as chaves aqui.
1 A menos que você use o
fish
shell.fonte
+
não reduzir o uso de CPU, usando;
não levar a um comando muito longa erro.Suponha que você esteja usando o gnu find , você pode usar a
-delete
opção:o que é mais fácil de lembrar.
fonte
No meu computador quando uso:
Os diretórios são excluídos, mas eu recebo o erro:
para cada diretório.
Como meus diretórios não estão vazios, a opção -delete não funcionará para mim. Encontrei o motivo desse comportamento aqui :
Eu usei isso para solucionar o problema:
Lembre-se de que o find ainda tentará recursar nos diretórios denominados dirname, o que não é realmente necessário e levará mais tempo. Dependendo da sua estrutura de diretórios, você poderá contornar isso com a
--depth
opção find. Além disso, se você tiver uma estrutura de diretórios como dirname / foo / dirname, receberá rm "Não existe esse arquivo ou diretório". Para suprimir os erros, você pode redirecionar o stderr para / dev / null ou usar o-f
sinalizador (force) com rm.fonte
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
é uma versão failproof que não falhar em espaços-prune
.-prune
para evitar o erro "Esse arquivo ou diretório não existe".Uma maneira mais rápida de fazer isso é:
Caso você tenha ".svn" dentro de outro ".svn".
fonte
Solução específica do Bash:
fonte
bash: /bin/rm: Argument list too long
Descobri que a
-delete
ação funciona bem com o-path
teste. Por exemplo, o seguinte deve funcionar no problema de pôsteres originais:fonte
-delete
implica-depth
, e com certeza exclui diretórios não vazios no meu sistema.