[英]bash: ./script.sh: Argument list too long
我有下面的脚本,可以在带有./checkres.sh *甚至* .jpg的图像目录中使用该脚本,但是该脚本仅在文件数量少(少于100个左右)时起作用。 除此之外,它还会因错误“参数列表过长”而停止,并且我有100,000个要处理的图像。
我在网上浏览了好几个小时,尝试了几十种不同的更改,使用了一段时间而不是for循环以及对变量的各种其他更改,但似乎没有任何效果。
当我不熟悉bash脚本并且用尽了所有想法时,谁能帮助解决这个谜。
#!/bin/bash
for img in "$@"
do
export height=`identify -format %h "$img"`
export width=`identify -format %w "$img"`
let ratio=$width/$height
echo Image "$img" = [ $width x $height ] = $ratio
if [ $ratio == 0 ]
then
echo Portrait 0
convert "$img" -geometry 600x800 -format jpeg -quality 80 "$img"
else
echo Landscape 1
convert "$img" -geometry 800x600 -format jpeg -quality 80 "$img"
fi
您无需更改脚本的任何内容。 只需更改调用方式即可:
find . -maxdepth 1 -name '*.jpg' -exec ./checkres.sh '{}' +
这将在每次调用时仅放入尽可能多的文件名,并在必要时多次运行脚本。
实际上-除非您更改调用约定,否则您无法通过更改脚本来解决此错误,因为问题是在shell尝试启动脚本时发生的!
但是,还有另一种解决方法-您可以将其定义为Shell函数(在~/.bashrc
或类似文件中),而不是将其定义为外部脚本,这意味着它不需要作为外部命令启动,表示相关的操作系统限制不适用。
checkres() {
for img; do
...
done
}
checkres *.jpg
...完全在shell中执行,消除了对命令行长度的任何限制,这些限制可以在执行期间传递给外部命令。
如果要使用目录参数:
for img in "$1"/*; do
以这种方式正确报价将确保您的代码可以处理包含空格的目录名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.