find命令重命名匹配文件后,为何不会重复处理新生成的文件?
为什么find不会处理它自己操作生成的新文件?
这个问题问得特别接地气!我刚上手用find做批量操作的时候也踩过类似的疑惑点,其实核心原因在于find命令的执行逻辑是“先收集、后处理”,具体拆解来看:
- find的工作流程是先完整遍历目标目录(包括子目录),把所有一开始就符合匹配规则(比如
*.txt)的文件全部收集到一个待处理列表里,这个扫描过程是一次性完成的,不会中途停下。 - 等整个目录树扫描完毕、待处理列表确定之后,find才会逐个对列表里的文件执行你指定的操作(比如
mv重命名)。
举个具体的例子:假设你当前目录里有a.txt、b.txt两个文件,执行find . -name "*.txt" -exec mv {} $(basename {} .txt)_hello.txt \;的时候:
- 第一步,find先扫描整个目录,把
a.txt和b.txt加入待处理列表; - 第二步,find开始依次处理列表里的文件:先把
a.txt改成a_hello.txt,这时候目录里多了一个新的a_hello.txt(确实符合*.txt规则),但这个文件不在之前的待处理列表里; - 接着处理
b.txt,改成b_hello.txt,整个操作就结束了,find不会再回头重新扫描目录。
简单说就是:find不会在执行操作的过程中实时更新它的待处理列表,所有要处理的文件都是操作开始前就已经存在的“存量文件”,后续生成的“增量文件”不在它的扫描范围内。
如果想要监控并处理后续生成的新文件,那就要用到文件系统监控工具(比如inotifywait),但这已经是完全不同的工具逻辑了。
内容的提问来源于stack exchange,提问作者Kusalananda
相关产品推荐
相关产品推荐

