![在 find [duplicate] 中与参数 -name 匹配的值使用双引号](https://linux22.com/image/122612/%E5%9C%A8%20find%20%5Bduplicate%5D%20%E4%B8%AD%E4%B8%8E%E5%8F%82%E6%95%B0%20-name%20%E5%8C%B9%E9%85%8D%E7%9A%84%E5%80%BC%E4%BD%BF%E7%94%A8%E5%8F%8C%E5%BC%95%E5%8F%B7.png)
为什么与参数-name
in匹配的值find
必须用双引号引起来?
# find / -type f -name *.out |wc -l 1>mv.out
0403-027 The parameter list is too long.
# cat mv.out
0
# find / -type f -name "*.out" |wc -l 1>mv.out
# cat mv.out
146302
答案1
如果没有双引号,则*.out
shell 会扩展 ,这意味着它会被当前目录中匹配的所有文件名替换*.out
(主要是任何以点结尾.out
但不以点开头的文件)。在您的情况下,似乎至少有两个匹配的文件find
作为参数传递给。find
不知道如何处理它们并抱怨参数列表太长。
通过引用该模式,shell 会保持原样,只需删除引号并find
看到一个未更改的参数*.out
,这可能就是您想要的。
答案2
我不确定这是否完全正确。但我相信将其放在引号中会使解析器将其读取为正则表达式。如果没有引号,我相信星号代表当前目录中的所有文件。
检查以下之间的输出差异:
$ echo $(find ./ -name *)
和
$ echo $(find ./ -name "*")
因此,使用第一个命令您可能会收到错误。如果你有文件富&酒吧在当前目录中,星号代表文件名。所以命令解析器会像这样读取命令:
$ echo $(find ./ -name foo bar)
错误输出将是find: bar: unknown primary or operator
.
第二个命令将星号读取为正则表达式,表示搜索任何文件名。
编辑:尽管现在,在对命令进行了更多测试之后,似乎在我的系统上,无论参数值是否在引号中,只要某些文本与星号组合在一起,它就可以工作:
$ echo $(find ./ -name *foo)
是相同的
$ echo $(find ./ -name "*foo")
也许我误解了这个问题?