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
findno Linux pula os resultados esperados quando-oé usado? -
-deleteimplica-depth, portanto, os objetos são excluídos na ordem correta. -
Aviso:
find . …deve funcionar bem, masfind path …pode não funcionar. Considerefind /mnt/a.pyc/foo/ \( -name '*.pyc' -o -path '*.pyc/*' \) -deleteO
-path '*.pyc/*'corresponderá a tudo enquanto-name '*.pyc'pode não corresponder a nada. Nesse caso, o comando excluirá mais do que você espera. -
-deletenão é exigido pelo POSIX . A solução portátil precisa de-exec rm …ouxargs. 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
-prunepara evitar este cenário: Exclua arquivos e diretórios por seus nomes. Nenhum arquivo ou diretório desse tipo .