Como usar find com -delete ao procurar por diretórios

0

Eu sei que posso fazer

find . -name '*.pyc' -delete

Mas quando estou procurando diretórios específicos, -delete falha ao informar que os diretórios não estão vazios.

É possível forçar a localização para excluir diretórios não vazios? Eu não quero usar -exec rm -rf '{}' porque parece mais propenso a erros.

    
por Peter Kilczuk 11.12.2013 / 18:57

1 resposta

1

find . \( -name '*.pyc' -o -path '*.pyc/*' \) -delete

Se um diretório corresponder a -name '*.pyc' , tudo o que estiver dentro corresponde a -path '*.pyc/*' . E o contrário: se algo corresponder a -path '*.pyc/*' , então existe um diretório que corresponde a -name '*.pyc' em algum lugar acima dele. Usamos OR lógico ( -o ) para excluir objetos de qualquer tipo.

Notas:

  • Você precisa de colchetes por causa disso: Por que find no Linux pula os resultados esperados quando -o é usado?
  • -delete implica -depth , portanto, os objetos são excluídos na ordem correta.
  • Aviso: find . … deve funcionar bem, mas find path … pode não funcionar. Considere

    find /mnt/a.pyc/foo/ \( -name '*.pyc' -o -path '*.pyc/*' \) -delete
    

    O -path '*.pyc/*' corresponderá a tudo enquanto -name '*.pyc' pode não corresponder a nada. Nesse caso, o comando excluirá mais do que você espera.

  • -delete não é exigido pelo POSIX . A solução portátil precisa de -exec rm … ou xargs . Eu não sei o que você quer dizer com "mais propenso a erros". Seu -exec rm -rf '{}' parece quase perfeito. Depois de adicionar -- , parece completamente bom para mim:

    find . -name '*.pyc' -prune -exec rm -rf -- {} +
    

    Eu usei -prune para evitar este cenário: Exclua arquivos e diretórios por seus nomes. Nenhum arquivo ou diretório desse tipo .

por 12.10.2018 / 23:42

Tags