为什么与参数-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")
也许我误解了这个问题?