-delete
implica -depth
que não funciona -prune
( -depth
começa com as folhas). Há um aviso sobre isso no manual da versão GNU ( -delete
é uma extensão do FreeBSD agora também suportada pelo GNU find
e algumas outras implementações).
info find --index-search=-delete
O uso da ação '-delete' na linha de comando ativa automaticamente a opção '-path' (* note find Expressions: :). Isso pode ser surpreendente se você estava testando anteriormente com '-print', por isso é melhor lembrar de usar '-pth' explicitamente.
info find --index-search=-prune
Como '-delete' implica '-pth', usar '-prune' em combinação com '-delete' pode resultar na exclusão de mais arquivos do que você pretendia.
Aqui, você tem a opção de usar rm
:
find . -name save -prune -o -type f -exec rm -f {} +
(potencialmente inseguro se houver diretório gravável por outras pessoas, pois é possível excluir arquivos fora da árvore de diretórios atual, substituindo os diretórios por links simbólicos enquanto você executa esse comando).
Uma alternativa mais segura:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
Isso não tem o problema mencionado acima, mas significa executar um rm
por arquivo. A --
é necessária para a implementação FreeBSD, e não o GNU um que nomes de arquivos prefixos com ./
.
Como alternativa, conforme sugerido por Costas:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(mas isso ainda é desnecessário em save
diretórios)
The LC_ALL=C
is there *
corresponde a qualquer sequência de bytes (mesmo aqueles que não formam caracteres válidos no código de idioma atual). Observe que isso afetará o idioma das mensagens de erro (inglês em vez do idioma do usuário).
mv save/ ../some/safer/location
antes de um comando de exclusão "genérico" (... mas é claro, antes de sua postagem, eu teria feito a mesma verificação e enfrentado o mesmo problema!). Agora vá encontrar um bom "undelete" para o sistema de arquivos em que os arquivos estavam ^ ^ #