首页 > 解决方案 > /bin/ls: 参数列表太长

问题描述

尝试在运行最新 macOS 的最大 MBP 16" 上使用 bash 脚本将超过 10K 推文的 twitter 帐户转换为另一种格式。

运行几分钟后输出许多句点,它说,line 43: /bin/ls: Argument list too long. 假设这个问题与推文的数量有关,所以虽然我可以尝试分成小块作为最后的手段,但不知道避免错误的最大数量是多少,决定首先寻找解决方案。

搜索谷歌和 SO,发现“ bash: /bin/ls: Argument list too long ”。如果我的问题是相同的,听起来用“find -name”替换“ls”可能会有所帮助。尝试过同样的错误,但可能不是正确的语法。

当前使用“ls”的两行如下(第一行是当前错误抱怨的行):

for fileName in `ls ${thisDir}/dotwPosts/p*` ; do

printf "`ls ${thisDir}/dotwPosts/p* | wc -l` posts left to import.\n"

尝试将第一行更改为(错误提示为/usr/bin/find: Argument list too long)。

for fileName in `find -name ${thisDir}/dotwPosts/p*` ; do

可能需要提供额外的代码,但不想让问题太具体到我的需求,希望其他人看到这个常见错误,而其他 stackoverflow 答案似乎并不适用。

标签: bashmacos

解决方案


要在 bash 中遍历目录中的文件,请将文件名打印为零分隔流并读取它。这样您就不需要在任何地方一次存储所有文件名:

find "${thisDir}/dotwPosts/" -maxdepth 1 -type f -name 'p*' -print0 |
while IFS= read -d '' -r file; do
   printf "%s\n" "$file"
done

要获得计数,请为每个文件输出一个字符并计算字符数:

find "${thisDir}/dotwPosts/" -maxdepth 1 -type f -name 'p*' -printf . | wc -c

不要使用 ` 反引号,不鼓励他们使用。Bash 黑客 wiki 不鼓励和弃用语法。改为使用$(...)

for fileName in $(...)是 bash 中常见的反模式。如果你想迭代另一个命令的输出,很可能你应该使用while IFS= read -r line循环。bashfaq 如何逐行(和/或逐字段)读取文件(数据流、变量)?


推荐阅读