繁体   English   中英

bash:./script.sh:参数列表太长

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM