find-name 如何工作?

find-name 如何工作?

我一生都无法弄清楚find测试是如何-name进行的。

我运行find / -name *in并返回一堆结果:

/sbin
/sbin/sulogin
/dev/stdin

仅举几例。

就好像它执行了文件名扩展,但这是在 shell 运行命令之前发生的,所以不可能是这样。还因为我当前目录中没有任何匹配的文件*in。另外,单引号*in会产生相同的结果,这进一步证明这不能是文件名扩展。

该文档让我相信findwith-name使用正则表达式,但正则表达式模式*in与我上面显示的结果不匹配。

有人可以启发我吗?

答案1

传递给的参数-name是一个文件系统全局模式,与您为其他命令输入的相同,例如ls -l *in.

对于找到的每个文件,它会比较基本名称文件到您传递的模式。因此,当它发现/bin/foobarfoobar与进行比较时*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

相关内容