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)
事件的确切顺序将类似于
foodir
find
exec
foodir 命令,删除 foodir所以你所看到的是完全可以解释的,如果从外部角度来看有些出乎意料。
缓存几乎可以肯定是为了提高性能,为每个文件节省大量的系统调用以及相当多的潜在磁盘 I/O。如果没有事务性文件系统,这很常见但不能保证,即使 find 确实为每个条目读取了一次目录,也不能保证您不会遇到这样的问题;尤其是在非本地文件系统的情况下,甚至条目的顺序也可能在检查之间发生变化,因此您也不能简单地跟踪索引,而必须跟踪您访问过的每个目录条目。对于大型目录层次结构,这很快就会变得令人望而却步。
通常,这被称为“竞争条件”:计算完成和使用结果值之间变化的计算的前提条件。
查看 GNU find 的手册页,有一个选项-ignore_readdir_race
可能有助于抑制警告。但是,我不知道这对通过 find 执行的任何其他命令有多大作用。根据您的需要,这可能就足够了。您还可以通过将其标准错误重定向到 /dev/null(附加2>/dev/null
到命令行)来抑制 find 中的任何错误和警告,但我不建议这样做,因为它可以隐藏更严重的错误。我也不知道这将如何与调用命令的任何错误输出交互。