bash - /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 答案似乎并不适用。
解决方案
要在 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 如何逐行(和/或逐字段)读取文件(数据流、变量)?
推荐阅读
- php - 如何识别 Wordpress 默认文本小部件的单个实例?
- reactjs - 使用 react-router 时如何防止 React 应用程序崩溃
- laravel - 将 Laravel 从 5.4 升级到 5.7 后出现 Artisan 错误
- javascript - 如何将来自控制器的 JSON 响应存储在 Javascript 变量中
- opencv3.0 - 自适应阈值和轮廓检测
- ruby-on-rails - 我无法使用 SFTP(Filezilla 软件)通过下载文件并在本地机器文本编辑器上编辑来更新 ruby on rails 生产代码
- ios - 如何为 Mobile SDK iOS 生成许可证密钥
- sql - 看不到任何添加到我的表中的东西,如果它被添加的话
- r-exams - `exams2nops()` 中的多个图
- airflow - 气流:既没有设置 SQLALCHEMY_DATABASE_URI 也没有设置 SQLALCHEMY_BINDS