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, masfind path …
pode não funcionar. Considerefind /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 …
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
-prune
para evitar este cenário: Exclua arquivos e diretórios por seus nomes. Nenhum arquivo ou diretório desse tipo .