Por que a exclusão de diretórios gera mensagens de erro com find -exec?

3

Por que é isso:

find . -type d -name test -exec rm -r {} \;

gera mensagens de erro:

find: ./foo/test: No such file or directory
find: ./bar/test: No such file or directory
find: ./blech/test: No such file or directory

mesmo que na verdade exclua os diretórios relevantes?

Isso é com o OS X (10.10).

    
por Paul R 01.10.2015 / 11:40

2 respostas

6

Encontre usos readdir() para obter o conteúdo dos diretórios.

Como readdir () é uma função de biblioteca que implementa o armazenamento em cache e como find mesmo sem armazenamento em cache não pode saber que o programa chamado remove um diretório recém-descoberto, uma chamada de localização padrão sempre causará esses erros.

Existe uma solução limpa para o seu problema:

find . -depth ...

(substitua ... pelo resto da linha de comando do find)

dirá find para processar todo o conteúdo do diretório antes do próprio diretório.

BTW: eu recomendo que você leia a página find man. Há 26 anos, há uma solução melhor do que -exec ... {} \; , pois isso é lento e cria um subprocesso para cada ocorrência. Procure -exec ... {} + , pois isso coleta os nomes dos caminhos até que o tamanho máximo dos argumentos seja atingido.

    
por 01.10.2015 / 12:47
1

Pergunta original

Todas as palavras após -exec até \; são interpretadas como parâmetros, isto é, elas são expandidas pelo shell de onde você executa o comando (você pode tentar o que acontece se um diretório denominado {} existir), mas eles são interpretados como se fossem citados. Você precisa de um shell para expandir globs:

find . -type d -exec bash -c 'echo {}/*' \;

Atualizar

Ao excluir diretórios, depois de excluir um diretório pai, você não poderá mais excluir seus filhos - eles desaparecerão.

    
por 01.10.2015 / 11:47

Tags