如果未引用 -name 之后的模式,则 find 会出现奇怪的行为

如果未引用 -name 之后的模式,则 find 会出现奇怪的行为

奇怪的是,有时 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”的文件,则在调用findshell之前,将*.txt参数替换为匹配的文件名,并且您的命令将变为如下所示:

find /tmp -type f -name file1.txt file2.txt file3.txt ...

根据扩展是否返回,您至少可以获得三个结果......

  • ...多个文件:你会得到一个错误
  • ...一个文件及其名称与您正在运行的路径中的文件名匹配find测试-name将仅匹配该一个文件
  • ...一个文件,它与搜索路径中的任何文件都不匹配: -name将不匹配任何内容

另一方面,如果 CWD 这样做不是包含任何 txt 文件,然后*.txt传递给它find,它的行为与引用它完全相同。

寓意:使用时find总是在包含 glob 的模式周围加上引号,除非您确实希望发生路径名扩展(您很少会看到故意为该-name选项这样做)。

相关内容