我有下面的脚本,我在./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
答案 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
以这种方式正确引用将确保您的代码可以处理包含空格的目录名称。