A página man do GNU find
adverte claramente que usar -delete
implica -depth
. No entanto, não consigo encontrar nenhuma explicação para este requisito:
-delete
Deletar arquivos; true se a remoção for bem-sucedida. Se a remoção falhar, uma mensagem de erro será emitida. […] O uso de-delete
liga automaticamente a-depth
opção.
find --version
find (GNU findutils) 4.8.0
Isso é implicitamente um passeio pós-ordem:
find /path -type f -delete
Mas este é um passeio de pré-encomenda, o método usual de travessia para find
:
find /path -type f -exec rm -f {} +
Se eu quiser usar -prune
, não posso usar -delete
e, em vez disso, devo usar o mais complicado -exec rm {} +
, mas o efeito líquido parece o mesmo.
A -delete
ação não remove diretórios, então por que find -delete
precisa implicar -depth
?
Para utilitários GNU, a documentação de referência são os arquivos de informações dos utilitários, não suas páginas de manual; como acontece em alguns casos, a página de manual citada na pergunta é enganosa.
find -delete
pode remover diretórios :-delete
sempre suportou a exclusão de diretórios, desde sua introdução no GNUfind
em 2004 (findutils
4.2.3).A exclusão de diretórios é a razão
-delete
implícita-depth
: ele só pode excluir diretórios se os tiver esvaziado anteriormente.-delete
em diretórios é equivalente armdir
, nãorm -rf
.O efeito líquido de
find /path -type f -delete
efind /path -type f -exec rm -f {} +
é o mesmo porque ambas asfind
invocações limitam suas ações a arquivos. Como apenas os arquivos são excluídos, a ordem em que eles são excluídos não afeta afind
passagem de . Ao excluir diretórios,find
a travessia de 's entra em jogo. Se-delete
for usado em diretórios, todos os filhos de um diretório devem ter sido processados antes que o próprio diretório possa ser excluído; é aqui que-depth
é útil. Serm -rf
for usado em diretórios que estão sendo percorridos,find
deve ser informado sobre a exclusão antes de tentar percorrer os filhos de um diretório excluído; esta é uma instância onde-prune
é útil.Pode-se imaginar uma caixa especial para que não seja definido
-depth
se não for excluir diretórios, mas isso é impossível determinar com antecedência no caso geral. (-depth
é uma opção, não uma ação; ela precisa ser definida antes que a primeira ação seja realmente processada.)Alternativamente, como foi proposto no passado , pode-se imaginar não ter nenhum tratamento especial
-delete
e deixar o usuário cuidar de garantir que-delete
possa fazer seu trabalho quando necessário. No entanto , isso quebraria a compatibilidade com versões anteriores e a compatibilidade com outras implementações que copiaram-delete
. Veja também a discussão em Savannah bug #20865 .O GNU
findutils
verifica explicitamente para-delete
combinado com-prune
desde a versão 4.3.11 e aborta se-depth
não tiver sido definido explicitamente. Os comentários observam queConforme discutido em Por que find com -delete apagou os arquivos no meu diretório /save/ quando find sem delete não conseguiu localizá-los? , se você estiver usando GNU
find
, você deve usar-execdir rm {} +
em vez de-exec rm {} +
.