即使未引用搜索模式,为什么 find 仍递归列出 .log 文件

即使未引用搜索模式,为什么 find 仍递归列出 .log 文件

我正在使用的 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 是zshcshtcsh最新版本fish(事实上,它在早期版本的 Unix 中是可以的,但在 70 年代末的 Bourne shell 中被破坏,然后在某些 shell 中再次修复)。通过bash,您可以使用shopt -s failglob以获得更好的行为。

.log请注意,如果当前目录中有一个文件(例如file.log),它将变为:

find . -name file.log

如果有多个(例如file1.logfile2.log),则将变为:

find . -name file1.log file2.log

这将是无效的find调用。

答案2

shell可以扩展的是初始点,在你的情况下,.但不是搜索模式。
所以按设计工作。

下面的命令将进行 shell 扩展。

find *log 

这个命令本身没有多大意义,因为您也可以使用

ls -1 *log

更新

正如您在下面的评论中提到的,您的 shell 负责引用搜索模式。
您是对的,搜索模式将由 shell 扩展,但这通常会导致错误,这在 参考资料 部分的手册页中进行了find描述NON-BUGS

相关内容