find -exec 是否会预先查找所有结果,还是会查找在执行先前结果时添加的结果?

find -exec 是否会预先查找所有结果,还是会查找在执行先前结果时添加的结果?

因此,如果我要下载 5000 个音频文件,每个文件时长 5 秒,在第一个 1000 个下载之后,我运行:

find . -iname "*.wav" -exec play {} \;

它会只播放我第一次运行该命令时存在的 1000 个文件,还是会播放所有 5000 个文件,因为文件的下载速度比 exec 完成它们的速度快?

答案1

这取决于实施,因为标准说

如果从正在搜索的目录层次结构中删除或添加文件,则未指定是否寻找将该文件包含在其搜索中。

我认为这两种行为都可能发生,具体取决于目录布局和文件系统行为。如果在find打开目录以读取其条目后,新添加的条目由 返回readdir,则find也将处理该情况。但这也未指定POSIX

如果在最近一次调用opendir()或后从目录中删除或添加文件rewinddir(),则后续调用是否readdir()返回该文件的条目是未指定的。


至少在 macOS 上使用 GNU find 和 BSD find 时,行为似乎是一次读取目录的所有条目:

% (sleep 5; touch abc) & find . -exec sleep 5 \; -print
[1] 57727
.
[1]  + 57727 done       ( sleep 5; touch abc; )
./foo
./bar

注意它是如何没有找到的abc。但如果第一个sleep减少,则find递归为. 结束sleep了:

% rm abc; (sleep 2; touch abc) & find . -exec sleep 5 \; -print
[1] 57971
[1]  + 57971 done       ( sleep 2; touch abc; )
.
./abc
./foo
./bar

因此,如果您的文件被下载到不同的子目录中,则find运行后下载的某些文件可能会播放,但其他一些文件可能不会播放。

相关内容