为啥使用通配符将参数数量减半会因“参数列表太长”而失败? [复制]
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 <path>/
,你要求ls
列出<path>
的文件。但是使用ls <path>/*horiz
,shell 会将星号扩展为实际的文件列表,例如
ls <path>/<prefix1>horiz <path>/<prefix2>horiz ... <path>/<prefixN>horiz
但是这个列表对于单个 shell 行来说太长了,所以它会给你错误。
【讨论】:
【参考方案2】:这有一个参数,目录名,ls
在内部循环:
ls <path>/
但是请注意,这不是一个论点:
ls <path>/*horiz
在这里,shell 本身将<path>/*horiz
扩展为所有匹配的文件,然后使用该匹配列表启动ls
。
你可以试试这样的:
ls <path>/ | grep -c 'horiz$'
【讨论】:
以上是关于为啥使用通配符将参数数量减半会因“参数列表太长”而失败? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?