![即使未引用搜索模式,为什么 find 仍递归列出 .log 文件](https://linux22.com/image/123844/%E5%8D%B3%E4%BD%BF%E6%9C%AA%E5%BC%95%E7%94%A8%E6%90%9C%E7%B4%A2%E6%A8%A1%E5%BC%8F%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20find%20%E4%BB%8D%E9%80%92%E5%BD%92%E5%88%97%E5%87%BA%20.log%20%E6%96%87%E4%BB%B6.png)
我正在使用的 find 命令会递归地列出所有 .log 文件,即使匹配的模式没有被引用。据我所知,如果搜索模式没有被引用,它将被shell扩展,然后find命令将对其起作用,这应该只给出当前目录中的.log文件。
寻找 。 -iname *.log
答案1
您可能正在使用这些 shell 之一,就像bash
大多数其他 POSIX shell 一样,当 glob 与任何文件不匹配时,它们不会报告错误,而是将 glob 逐字(未扩展)传递给应用程序(并且碰巧没有非-.log
当前目录中带有扩展名的隐藏文件)。
在那些贝壳中,你会发现
echo *.log
输出
*.log
而不是像这样的错误:
zsh: no matches found: *.log`
fish: No matches for wildcard '*.log'. See `help expand`.
echo *.log
echo: No match.
.log
因此,如果当前目录中没有文件:
find . -name *.log
会是一样的
find . -name '*.log'
其中一个文字*.log
参数被传递给find
.
已修复此问题的 shell 是zsh
、csh
和tcsh
最新版本fish
(事实上,它在早期版本的 Unix 中是可以的,但在 70 年代末的 Bourne shell 中被破坏,然后在某些 shell 中再次修复)。通过bash
,您可以使用shopt -s failglob
以获得更好的行为。
.log
请注意,如果当前目录中有一个文件(例如file.log
),它将变为:
find . -name file.log
如果有多个(例如file1.log
和file2.log
),则将变为:
find . -name file1.log file2.log
这将是无效的find
调用。
答案2
shell可以扩展的是初始点,在你的情况下,.
但不是搜索模式。
所以按设计工作。
下面的命令将进行 shell 扩展。
find *log
这个命令本身没有多大意义,因为您也可以使用
ls -1 *log
更新
正如您在下面的评论中提到的,您的 shell 负责引用搜索模式。
您是对的,搜索模式将由 shell 扩展,但这通常会导致错误,这在 参考资料 部分的手册页中进行了find
描述NON-BUGS
。