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

时间:2015-02-27 15:39:27

标签: linux bash shell

我有下面的脚本,我在./checkres.sh *甚至* .jpg的图像目录中运行,但它只适用于少量文件,少于100个左右。任何更多的东西,它会因错误而停止"参数列表太长"我有10万张图像需要处理。

我一直在网上看了好几个小时,尝试了几十个不同的变化,使用了一段时间而不是for循环和变量的各种其他变化,但似乎没有任何效果。

任何人都可以帮助解决这个谜团,因为我是新手来编写脚本并且已经没有想法了。

#!/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

2 个答案:

答案 0 :(得分:3)

您无需更改脚本的任何内容;只是改变你调用它的方式:

find . -maxdepth 1 -name '*.jpg' -exec ./checkres.sh '{}' +

这将在每个调用中放置尽可能多的文件名,并根据需要多次运行脚本。


实际上 - 除非你改变调用约定,否则你不能通过更改脚本的任何内容来修复这个bug,因为在shell尝试启动它时会发生问题! / p>

但是,还有另一种解决方法 - 您可以将其定义为shell函数(在~/.bashrc或类似内容中),而不是将其定义为外部脚本,这意味着它不需要像外部命令,意味着操作系统限制不适用。

checkres() {
  for img; do
    ...
  done
}
checkres *.jpg

...完全在shell中执行,对命令行长度有任何限制,可以在执行期间传递给外部命令。

答案 1 :(得分:0)

如果要获取目录参数:

for img in "$1"/*; do

以这种方式正确引用将确保您的代码可以处理包含空格的目录名称。