find 和 rm -rf,为什么它打印错误?

find 和 rm -rf,为什么它打印错误?

我肯定做错了什么,但无法弄清楚这一点。当我rm -rf在目录上运行时,find我得到一个No such file or directory,但当我手动执行时,它不会发生。假设有以下目录树:

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

我创建目录并向其中添加文件:

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

我确信我有它们:

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

但是删除它们会导致 find 打印错误:

[~]$ 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

他们被移除了,但是那里发生了什么?


以不同的方式执行此操作不会引发错误:

[~]$ 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

为什么find会报这个错误? 据我所知,如果-exec存在,-print则不会调用该操作(这就是我最初怀疑的)。

我使用 find 4.6.0 和 find 4.5.11 复制了上述内容

答案1

当您使用 删除目录时rm -rffind删除后仍然尝试进入该目录(它不知道在rm做什么)。这就是错误发生的地方。

您应该添加该-depth标志。

POSIXfind手册

-depth

初级应始终评估为真;它将导致目录层次结构下降,以便目录中的所有条目都在目录本身之前执行。如果-depth未指定主目录,则目录中的所有条目都应在目录本身之后进行操作。如果指定了任何主值,则即使通常不会计算主值,-depth它也应适用于整个表达式。-depth

相关内容