我肯定做错了什么,但无法弄清楚这一点。当我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 -rf
,find
删除后仍然尝试进入该目录(它不知道在rm
做什么)。这就是错误发生的地方。
您应该添加该-depth
标志。
-depth
初级应始终评估为真;它将导致目录层次结构下降,以便目录中的所有条目都在目录本身之前执行。如果
-depth
未指定主目录,则目录中的所有条目都应在目录本身之后进行操作。如果指定了任何主值,则即使通常不会计算主值,-depth
它也应适用于整个表达式。-depth