![如果未引用 -name 之后的模式,则 find 会出现奇怪的行为](https://linux22.com/image/122847/%E5%A6%82%E6%9E%9C%E6%9C%AA%E5%BC%95%E7%94%A8%20-name%20%E4%B9%8B%E5%90%8E%E7%9A%84%E6%A8%A1%E5%BC%8F%EF%BC%8C%E5%88%99%20find%20%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%A5%87%E6%80%AA%E7%9A%84%E8%A1%8C%E4%B8%BA.png)
奇怪的是,有时 find 中的 -name 的以下模式会意外地成功搜索到所有相应的文件名。按理说,它只能通过 shell 解析在当前目录下查找一个对应的文件名(不带引号的查找工具是找不到的)。
find /tmp -type f -name *.txt
/tmp/amp_iostat.txt
/tmp/awrrpt_1_7950_7973.txt
/tmp/oplanlog/osys/2014-07-01-12-26-28/log.txt
/tmp/oplanlog/osys/2014-07-01-13-15-33/log.txt
/tmp/oplanlog/osys/2014-07-01-13-17-58/log.txt
/tmp/oplanlog/osys/2014-07-01-13-30-27/log.txt
/tmp/oplanlog/osys/2016-10-27-19-38-50/log.txt
/tmp/pms2_20170427.txt
/tmp/pmsdb1_20170622.txt
/tmp/pmssh1_20160728.txt
/tmp/pmssh1_20160831.txt
/tmp/pmssh1_20161227.txt
/tmp/pmssh1_20170328.txt
/tmp/pmssh1_20170523.txt
/tmp/pmssh1_20170727.txt
/tmp/pmssh1_20170822.txt
/tmp/pmssh2_20170328.txt
/tmp/pmssh_20170119.txt
/tmp/pmssh_20170220.txt
/tmp/sgpms_20140717_1736_summary.txt
/tmp/sgpms_20140717_1736_trace.txt
/tmp/sgpms_20140717_1737_summary.txt
/tmp/sgpms_20140717_1737_trace.txt
/tmp/sgpms_20140717_1739_summary.txt
/tmp/sgpms_20140717_1739_trace.txt
/tmp/sgpms_20140717_1743_summary.txt
/tmp/sgpms_20140717_1743_trace.txt
/tmp/sgpms_20140717_1749_summary.txt
/tmp/sgpms_20140717_1749_trace.txt
/tmp/sgpms_20140717_1751_summary.txt
/tmp/sgpms_20140717_1751_trace.txt
find /tmp -type f -name *.txt|wc -l
31
答案1
没有任何引用的*.txt
情况下,须遵守路径名扩展(又名文件名扩展)。这发生在当前工作目录(CWD)。如果 CWD 包含任何扩展名为“txt”的文件,则在调用find
shell之前,将*.txt
参数替换为匹配的文件名,并且您的命令将变为如下所示:
find /tmp -type f -name file1.txt file2.txt file3.txt ...
根据扩展是否返回,您至少可以获得三个结果......
- ...多个文件:你会得到一个错误
- ...一个文件及其名称与您正在运行的路径中的文件名匹配
find
:测试-name
将仅匹配该一个文件 - ...一个文件,它与搜索路径中的任何文件都不匹配:
-name
将不匹配任何内容
另一方面,如果 CWD 这样做不是包含任何 txt 文件,然后*.txt
传递给它find
,它的行为与引用它完全相同。
寓意:使用时find
总是在包含 glob 的模式周围加上引号,除非您确实希望发生路径名扩展(您很少会看到故意为该-name
选项这样做)。