Como recursivamente excluo diretórios com curinga?

44

Estou trabalhando com o SSH em um WD My Book World Edition. Basicamente, eu gostaria de iniciar em um nível de diretório específico e remover recursivamente todos os subdiretórios correspondentes a .Apple* . Como eu faria isso?

Eu tentei

rm -rf .Apple* e rm -fR .Apple*

nenhum diretório excluído corresponde a esse nome em subdiretórios.

    
por codedog 29.10.2011 / 23:49

5 respostas

67

find é muito útil para executar seletivamente ações em uma árvore inteira.

find . -type f -name ".Apple*" -delete

Aqui, o -type f certifica-se de que é um arquivo, não um diretório, e pode não ser exatamente o que você deseja, pois também ignora links simbólicos, sockets e outras coisas. Você pode usar ! -type d , que literalmente significa não diretórios, mas também pode excluir dispositivos de caracteres e de blocos. Eu sugeriria olhar o predicado -type na página man para find .

Para fazer isso estritamente com um curinga, você precisa de suporte avançado ao shell. O Bash v4 tem a globstar opção , que permite corresponder recursivamente subdiretórios usando ** . zsh e ksh também suportam esse padrão. Usando isso, você pode fazer rm -rf **/.Apple* . Isso não é POSIX-padrão, e não é muito portátil, então eu evitaria usá-lo em um script, mas para uma ação de shell interativa única, tudo bem.

    
por 29.10.2011 / 23:53
11

Eu tive problemas ao usar find com -delete devido ao comportamento intencional de find (isto é, recusando-me a excluir se o caminho começar com ./, o que eles fazem no meu caso) conforme declarado em sua página man :

 -delete

Delete found files and/or directories. Always returns true. This executes from the current working directory as find recurses down the tree. It will not attempt to delete a filename with a "/" character in its pathname relative to "." for security reasons.
Depth-first traversal processing is implied by this option.
Following symlinks is incompatible with this option.

Em vez disso, consegui fazer apenas

find . -type d -name 'received_*_output' -exec rm -r {} +

Para o seu caso, parece que citando o glob (asterisco, *) era a solução, mas eu queria fornecer minha resposta caso alguém tivesse o mesmo problema.

NOTA: Anteriormente, minha resposta foi fazer o seguinte, mas @Wildcard apontou as falhas de segurança em fazer isso nos comentários.

find . -type d -name 'received_*_output' | xargs rm -r
    
por 25.11.2015 / 00:49
0

O que é possível é que não há nada errado com seu comando rm / find, mas que o usuário com o qual você está logado não possui permissões de exclusão. Use ls -l para listar coisas com suas permissões e você pode identificar quem você é com os comandos id e groups (ambos devem estar disponíveis). Se você é o "usuário errado" para fazer isso, você precisa alterar as permissões / propriedade dos arquivos ou mudar para outro usuário.

    
por 20.11.2011 / 10:10
0

Tente:

shopt -s dotglob           # using Bash
printf '%s\n' ./.Apple*    # test
#rm -rf ./.Apple*    
    
por 20.11.2011 / 12:28
-1

Comando simples:

rm 'find ./ -name '.Apple*'' -rf

Boa sorte!

    
por 20.11.2011 / 08:33