【发布时间】:2015-04-30 09:15:44
【问题描述】:
我有下面的脚本,我从带有 ./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
【问题讨论】:
-
这里有一些错误。您可以在 shellcheck.net 中查看基本的
-
使用目录 nene 作为参数不是更好吗?然后你可以在其中放置 TB 的图像,你的脚本不会出错。
-
顺便说一句——不要对定义命令的脚本使用
.sh扩展。想想如果你用 Python 重写它会发生什么——你是想让所有调用/调用它的东西都改变为运行./checkres.py,还是有一个以.sh命名的 Python 脚本?就叫它checkres,就像你运行ls,而不是ls.elf。 -
我也会考虑
if (( ratio == 0 ));更简单,更易读。如果您想使用[ ]进行该测试,则需要对其进行一些调整以使其更加健壮:[ "$ratio" -eq 0 ]会更好地处理极端情况。 -
@tgo,我还没有完整阅读那篇文章,但它的示例
3a也有问题。如果没有带有任意名称的-r,就不能安全地使用read(因为这将解释反斜杠转义序列而不是将它们视为文字)——或者,就此而言,不清除IFS并使用NUL分隔的流(处理真正奇怪的情况,例如名称中带有换行符的文件名)。缺乏严谨性令人不安。