我一生都无法弄清楚find
测试是如何-name
进行的。
我运行find / -name *in
并返回一堆结果:
/sbin
/sbin/sulogin
/dev/stdin
仅举几例。
就好像它执行了文件名扩展,但这是在 shell 运行命令之前发生的,所以不可能是这样。还因为我当前目录中没有任何匹配的文件*in
。另外,单引号*in
会产生相同的结果,这进一步证明这不能是文件名扩展。
该文档让我相信find
with-name
使用正则表达式,但正则表达式模式*in
与我上面显示的结果不匹配。
有人可以启发我吗?
答案1
传递给的参数-name
是一个文件系统全局模式,与您为其他命令输入的相同,例如ls -l *in
.
对于找到的每个文件,它会比较基本名称文件到您传递的模式。因此,当它发现/bin/foobar
它foobar
与进行比较时*in
,不匹配,则跳过;但与/bin/login
它相比login
,*in
这确实匹配,所以打印。
现在您需要小心,因为*in
可能会根据当前目录中的文件在命令行上进行匹配。
因此,例如:
$ find /bin -name *in
/bin
/bin/login
$ touch foobarin
$ find /bin -name *in
$
请注意,同一find
命令返回两个不同的结果。
如果我们将 shell 设置为调试模式,我们就会明白为什么:
$ rm foobarin
$ set -x
$ find /bin -name *in
+ find /bin -name '*in'
/bin
/bin/login
$ touch foobarin
+ touch foobarin
$ find /bin -name *in
+ find /bin -name foobarin
$
以 a 开头的行+
是 shell 解释输入的命令的内容。我们可以看到第二个find
命令扩展了 来*in
匹配现有的文件名。
正因为如此,建议引用名字
$ find /bin -name '*in'
+ find /bin -name '*in'
/bin
/bin/login