为什么在下面的示例中显示“没有这样的文件或目录”? 有避免此错误的解决方法,问题是为什么在这个确切的示例中会产生错误。
cd /tmp
mkdir -p TOP1/AB/AC/AD/AE/AF
mkdir -p TOP2/AB/AC/AD/AE/AF
find . -iname 'A*' -exec rm -rvf {} \;
removed directory: `./TOP1/AB/AC/AD/AE/AF'
removed directory: `./TOP1/AB/AC/AD/AE'
removed directory: `./TOP1/AB/AC/AD'
removed directory: `./TOP1/AB/AC'
removed directory: `./TOP1/AB'
find: `./TOP1/AB': No such file or directory
removed directory: `./TOP2/AB/AC/AD/AE/AF'
removed directory: `./TOP2/AB/AC/AD/AE'
removed directory: `./TOP2/AB/AC/AD'
removed directory: `./TOP2/AB/AC'
removed directory: `./TOP2/AB'
find: `./TOP2/AB': No such file or directory
使用 -depth
或 \+
或 -delete
修复此问题:
find . -iname 'A*' -exec rm -rvf {} \+
find . -depth -iname 'A*' -exec rm -rvf {} \;
find . -iname 'A*' -delete
最佳答案
我认为答案在手册页本身:https://linux.die.net/man/1/find
另见 \;
与 +
:Using semicolon (;) vs plus (+) with exec in find
为了更好地理解整个过程,您可以打印文件而不是删除它们。以 TOP1
文件夹为例:
find . -iname 'A*' -exec echo "{}" \;
输出:
./TOP1/AB
./TOP1/AB/AC
./TOP1/AB/AC/AD
./TOP1/AB/AC/AD/AE
./TOP1/AB/AC/AD/AE/AF
\;
所做的是:对当前目录中或当前目录下的每个文件运行文件。
这里的顺序很重要,即首先处理父文件夹,然后递归遍历其子文件夹。
另一方面,rm -frv
是这样工作的:
rm -frv ./TOP1
输出:
removed directory './TOP1/AB/AC/AD/AE/AF'
removed directory './TOP1/AB/AC/AD/AE'
removed directory './TOP1/AB/AC/AD'
removed directory './TOP1/AB/AC'
removed directory './TOP1/AB'
removed directory './TOP1'
所以 rm -fr
实际上与 find
相反,这是这里问题的主要原因:
find
和 \;
首先从父文件夹 TOP1
开始,其中文件夹 TOP1
及其由于部分 -exec rm -rvf {}\;
,内容将被完全删除。在下一轮 find
然后将尝试处理下面的下一个子文件夹,显然首先检查(通过 stat ./TOP1
),如果基本文件夹仍然存在,然后它才更深一层。但是由于 ./TOP1
已经在第一轮中被删除,stat ./TOP1
将失败,因此出现错误消息。
随着other parameters available对于 find
,您显然可以更改默认行为:
-depth
:在(父)目录本身之前处理每个目录的内容。 -delete 操作还暗示了 -depth。(即从最底部到顶部 - 就像rm -fr
一样!)-delete
:使用 -delete 会自动打开-depth
选项- 使用
+
:-exec rm -rvf {} +
部分只执行一次,例如-exec rm -rvf {} +
:
rm -frv ./TOP1/AB ./TOP1/AB/AC ./TOP1/AB/AC/AD ./TOP1/AB/AC/AD/AE ./TOP1/AB/AC/AD/AE/AF
最后但同样重要的是:
当 rm
与 -fr
参数一起使用时,它变得非常“宽容”,因此不会抛出任何错误。它将尝试强制和递归删除传递给它的所有内容;并且,如果它遇到不存在的文件/目录,它也不会提示。
关于linux - 找到 exec rm : No such file or directory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66912915/