使用查找删除文件夹 - 奇怪的消息

Mar*_*tus 4 find

mkdir foodir
find . -iname foodir -exec rm -fr {} \;
Run Code Online (Sandbox Code Playgroud)

它完成了这项工作,但会发出消息:

find: `./foodir': No such file or directory
Run Code Online (Sandbox Code Playgroud)

use*_*ser 6

事件的确切顺序将类似于

  1. 创建 foodir
  2. 发射 find
    1. find 读取当前目录,缓存结果,然后迭代它,找到 foodir 的条目
    2. find 启动execfoodir 命令,删除 foodir
    3. find 尝试递归到 foodir(它在 find 的内部缓存中),它不再存在
    4. find 显示无法递归到 foodir 的警告
    5. find 继续下一个条目(在这种情况下可能是目录条目列表的末尾,因此它在尽其所能完成工作后退出)

所以你所看到的是完全可以解释的,如果从外部角度来看有些出乎意料。

缓存几乎可以肯定是为了提高性能,为每个文件节省大量的系统调用以及相当多的潜在磁盘 I/O。如果没有事务性文件系统,这很常见但不能保证,即使 find 确实为每个条目读取了一次目录,也不能保证您不会遇到这样的问题;尤其是在非本地文件系统的情况下,甚至条目的顺序也可能在检查之间发生变化,因此您也不能简单地跟踪索引,而必须跟踪您访问过的每个目录条目。对于大型目录层次结构,这很快就会变得令人望而却步。

通常,这被称为“竞争条件”:计算完成和使用结果值之间变化的计算的前提条件。

查看 GNU find 的手册页,有一个选项-ignore_readdir_race可能有助于抑制警告。但是,我不知道这对通过 find 执行的任何其他命令有多大作用。根据您的需要,这可能就足够了。您还可以通过将其标准错误重定向到 /dev/null(附加2>/dev/null到命令行)来抑制 find 中的任何错误和警告,但我不建议这样做,因为它可以隐藏更严重的错误。我也不知道这将如何与调用命令的任何错误输出交互。