linux - 找到 exec rm : No such file or directory

标签 linux shell

为什么在下面的示例中显示“没有这样的文件或目录”? 有避免此错误的解决方法,问题是为什么在这个确切的示例中会产生错误。

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/

相关文章:

linux - 我们可以使用 sed 将一个变量替换为多个变量吗

Python 实现比 C 快

arrays - 比较 Unix 数组中的相邻值

regex - 将文本文件转换为单行

linux - linux shell 脚本中的一行 if/else 条件

c 编程 - 来自 DIR* 结构的目录名

bash - 如何读取文件的第 N 行并将其打印到新文件?

linux - 复制文件时Linux系统会锁定文件吗?

linux - 如果文件不存在,如何让 cp 报错

bash - 如何将 docker ENTRYPOINT 与 shell 脚本文件组合参数一起使用