find e rm -rf, por que imprime erros? [duplicado]

0

Eu definitivamente estou fazendo algo errado, mas não consigo entender isso. Quando executo rm -rf nos diretórios através de find , recebo um No such file or directory , mas isso não acontece quando eu o faço manualmente. Assumindo a seguinte árvore de diretórios:

[~]$ mkdir -p blueprints/blog
[~]$ find
.
./blueprints
./blueprints/blog

Eu crio diretórios e adiciono arquivos a eles:

[~]$ mkdir ./blueprints/blog/__pycache__ ./blueprints/__pycache__ ./__pycache__
[~]$ touch ./blueprints/blog/__pycache__/dummy.pyc ./__pycache__/dummy.pyc

Tenho certeza de que as tenho:

[~]$ find . -type d -name '__pycache__'
./blueprints/blog/__pycache__
./blueprints/__pycache__
./__pycache__

Mas removê-los faz com que o documento seja impresso:

[~]$ find . -type d -name '__pycache__' -exec rm -rf {} \;
find: ‘./blueprints/blog/__pycache__’: No such file or directory
find: ‘./blueprints/__pycache__’: No such file or directory
find: ‘./__pycache__’: No such file or directory

Eles são removidos, mas o que está acontecendo lá?

Fazer isso de uma maneira diferente não provoca o erro:

[~]$ mkdir ./blueprints/blog/__pycache__ ./blueprints/__pycache__ ./__pycache__
[~]$ touch ./blueprints/blog/__pycache__/dummy.pyc ./__pycache__/dummy.pyc
[~]$ find . -type d -name '__pycache__' -exec echo rm -rf {} \; | sh

Por que encontrar um relatório desse erro? Tanto quanto sei se -exec está presente, a ação -print não é invocada (foi o que desconfiei primeiro).

Eu repliquei o acima usando tanto encontrar 4.6.0 e encontrar 4.5.11

    
por grochmal 17.02.2017 / 21:53

1 resposta

3

Quando você exclui o diretório com rm -rf , find ainda tenta inseri-lo depois de excluí-lo (ele não tem noção do que rm está fazendo). É aí que o erro acontece.

Você deve adicionar o sinalizador -depth .

De o manual POSIX find :

-depth

The primary shall always evaluate as true; it shall cause descent of the directory hierarchy to be done so that all entries in a directory are acted on before the directory itself. If a -depth primary is not specified, all entries in a directory shall be acted on after the directory itself. If any -depth primary is specified, it shall apply to the entire expression even if the -depth primary would not normally be evaluated.

    
por 17.02.2017 / 22:08

Tags