GNU findutils执行find -name *.txt搜索结果随工作目录不一致问题
问题原因分析
该差异由Shell的通配符(globbing)预展开机制导致,与find命令本身逻辑无关
你执行的find /home -name *.txt未对*.txt做引号包裹或转义处理,Shell会在调用find命令之前,先尝试将*.txt通配符展开为当前工作目录下所有匹配该规则的文件名列表,再把展开后的参数传给find执行,两种场景的具体差异如下:
- 当前工作目录为
/tmp时:该目录下没有匹配
*.txt的文件,Shell无法完成通配符展开,会直接将*.txt作为参数原样传给find。此时find实际执行的规则是「在/home路径下搜索所有名称匹配*.txt的文件」,因此会返回两个符合要求的结果。 - 当前工作目录为
/home/bob时:该目录下存在匹配
*.txt的文件1.txt,Shell会直接将*.txt展开为1.txt,最终传给find的实际命令为find /home -name 1.txt,因此搜索结果仅会返回名称为1.txt的匹配文件。
修正方案
要让通配符规则直接交给find处理,需要对匹配规则做转义或引号包裹,以下三种写法均可以得到稳定的正确结果:
find /home -name '*.txt'(单引号包裹,Shell不会处理单引号内的任何内容)find /home -name "*.txt"(双引号包裹,不会触发通配符展开)find /home -name \*.txt(对通配符星号做转义,避免Shell识别为通配符标记)
内容的提问来源于stack exchange,提问作者Demi
相关产品推荐
相关产品推荐

