在 find [duplicate] 中与参数 -name 匹配的值使用双引号

在 find [duplicate] 中与参数 -name 匹配的值使用双引号

为什么与参数-namein匹配的值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

如果没有双引号,则*.outshell 会扩展 ,这意味着它会被当前目录中匹配的所有文件名替换*.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")

也许我误解了这个问题?

相关内容