我有下面的脚本,我使用./checkres.sh *或甚至*.jpg从图像目录中运行它,但它只有在文件数量较少时才有效,少于100个左右。任何更多,它停止错误“参数列表太长”和我有100,000的图像要处理。
我在网上找了几个小时,尝试了几十种不同的改变,使用while而不是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
发布于 2015-02-27 15:42:31
您不需要更改脚本的任何内容;只需更改调用它的方式:
find . -maxdepth 1 -name '*.jpg' -exec ./checkres.sh '{}' +
这将只在每次调用中放入合适的文件名,并根据需要多次运行脚本。
事实上,除非更改调用约定,否则不能通过更改脚本的任何内容来修复此bug,因为问题是在shell尝试启动它时发生的!
但是,还有另一种变通办法--您可以将其定义为shell函数(在~/.bashrc
或类似的脚本中),而不是将其定义为外部脚本,这意味着它不需要作为外部命令启动,这意味着所讨论的操作系统限制不适用。
checkres() {
for img; do
...
done
}
checkres *.jpg
...is完全在外壳中执行,模拟对命令行长度的任何限制,在执行过程中可以将其传递给外部命令。
发布于 2015-02-27 16:02:37
如果你想接受一个目录参数:
for img in "$1"/*; do
正确引用这种方式将确保您的代码可以处理包含空格的目录名。
https://stackoverflow.com/questions/28768811
复制相似问题