【发布时间】:2020-05-26 09:06:43
【问题描述】:
尝试在运行最新 macOS 的最大 MBP 16" 上使用 bash 脚本将超过 10K 推文的 twitter 帐户转换为另一种格式。
运行几分钟后输出多个句点,它显示line 43: /bin/ls: Argument list too long。假设这个问题与推文的数量有关,所以虽然我可以尝试分成小块作为最后的手段,但不知道避免错误的最大数量是多少,所以决定首先寻找解决方案。
搜索了 Google 和 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 答案似乎并不适用。
【问题讨论】:
-
为什么需要使用
ls?就for fileName in ${thisDir}/dotwPosts/p* -
Barmar 说的很对;但作为记录,如果您确实想使用
find解决此问题,正确的版本是find "$thisDir/dotwPosts" -maxdepth 1 -name 'p*'。 仅仅将ls替换为find -name是不可能的,因为您将发送给find的所有参数与发送给ls的参数相同。如果内核不允许后者,那么它也不会允许前者。 -
find在迭代其输出方面也不比ls好。 -
@cchiera :另一种缩短参数列表的方法是使用
cd ${thisDir}/dotwPosts; for fileName in *;...; do。当然,您只有fileName中文件的基本名称,并且您的工作目录也不同,但两者都是微不足道的问题。如果您仍然有太多目录条目,请考虑将循环替换为find .... | xargs ....,如果您的逻辑允许的话。由于我不知道循环内部发生了什么,所以我不知道这种替代方案的可行性。