Fin*_*ind 3 find regular-expression
我一生都无法弄清楚find测试是如何-name工作的。
我运行find / -name *in并返回一堆结果:
/sbin
/sbin/sulogin
/dev/stdin
Run Code Online (Sandbox Code Playgroud)
仅举几例。
就好像它执行了文件名扩展,但这发生在 shell 运行命令之前,所以不可能是这样。还因为我在当前目录中没有任何匹配*in. 另外,单引号*in产生相同的结果,这进一步支持这不能是文件名扩展。
文档使我相信,find与-name使用正则表达式,但正则表达式模式*in不匹配,结果我上面显示。
有人可以启发我吗?
传递给的参数-name是一个文件系统glob模式,与您为其他命令输入的相同,例如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
$
Run Code Online (Sandbox Code Playgroud)
请注意,相同的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
$
Run Code Online (Sandbox Code Playgroud)
以 a 开头的行+是 shell 解释输入的命令的内容。我们可以看到第二个find命令扩展了*in匹配现有的文件名。
因此,建议引用名称
$ find /bin -name '*in'
+ find /bin -name '*in'
/bin
/bin/login
Run Code Online (Sandbox Code Playgroud)