为啥使用通配符将参数数量减半会因“参数列表太长”而失败? [复制]

Posted

技术标签:

【中文标题】为啥使用通配符将参数数量减半会因“参数列表太长”而失败? [复制]【英文标题】:Why does using a wildcard to halve the number of arguments fail with "Argument list too long"? [duplicate]为什么使用通配符将参数数量减半会因“参数列表太长”而失败? [复制] 【发布时间】:2019-06-13 01:04:03 【问题描述】:
$ ls  <path>/ | wc -l
52137

完整的目录列表有效。但试图缩短文件的数量,我得到:

$ ls <path>/*horiz | wc -l
-bash: /bin/ls: Argument list too long
0  

为什么?

【问题讨论】:

【参考方案1】:

因为ls &lt;path&gt;/,你要求ls列出&lt;path&gt;的文件。但是使用ls &lt;path&gt;/*horiz,shell 会将星号扩展为实际的文件列表,例如

ls <path>/<prefix1>horiz <path>/<prefix2>horiz ... <path>/<prefixN>horiz

但是这个列表对于单个 shell 行来说太长了,所以它会给你错误。

【讨论】:

【参考方案2】:

这有一个参数,目录名,ls 在内部循环:

ls <path>/

但是请注意,这不是一个论点:

ls <path>/*horiz

在这里,shell 本身将&lt;path&gt;/*horiz 扩展为所有匹配的文件,然后使用该匹配列表启动ls

你可以试试这样的:

ls <path>/ | grep -c 'horiz$'

【讨论】:

以上是关于为啥使用通配符将参数数量减半会因“参数列表太长”而失败? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

用sed -i参数列表替换所有文件太长[关闭]

为啥标量值函数会因空参数而失败?

套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?

为啥我可以使用有界通配符作为参数而不是方法中的返回类型? [复制]

Maven 发布分支失败,错误=7,参数列表太长

参数列表太长 - lint-staged -> tslint