我应该如何使用位于多个子目录中的原始图像批量缩略图?
问题描述:
我有原始图像中的目录结构,看起来像这样:我应该如何使用位于多个子目录中的原始图像批量缩略图?
./Alabama/1.jpg
./Alabama/2.jpg
./Alabama/3.jpg
./Alaska/1.jpg
...the rest of the states...
我想所有的原始图像转换成缩略图,这样我就可以在网站上显示出来。有点挖/试验后,我想出了以下Linux命令:
find . -type f -iname '*.jpg' | sed -e 's/\.jpg$//' | xargs -I Y convert Y.jpg -thumbnail x100\> Y-small.jpg
它递归地查找所有的JPG图像在我的子目录,删除文件类型(.JPG)从他们身上,所以我可以将其重命名之后,然后将它们制作成缩略图,并在文件类型之前添加'-small'来重命名它们。
它适用于我的目的,但它有点复杂,它不是很健壮。例如,我不知道如何在文件名的开头插入'small-'(所以./Alabama/small-1.jpg
)。
问题:
- 是否有从位于多个子目录图像创建缩略图的更好,更可靠的方法?
- 我可以使现有命令更加健壮(例如,但使用
sed
在保存之前重命名输出的缩略图 - 基本上修改Y-small.jpg部分)。
答
无需构建这样一个复杂的构造。首先制作小块,然后连接。
我已决定不是在文件名中间插入-small
。它使一切变得更加复杂。最好使用前缀(更简单的代码,也更容易从拇指派生原始文件名),它可以是thumbsDir/
或thumbsPrefix-
。
#!/bin/sh
make_thumbnail() {
pic=$1
thumb=$(dirname "$1")/thumb-$(basename "$1")
convert "$pic" -thumbnail x100 "$thumb"
}
# Now we need a way to call make_thumbnail on each file.
# The easiest robust way is to restrict on files at level 2, and glob those
# with */*.jpg
# (we could also glob levels 2 and 3 with two globs: */*.jpg */*/*.jpg)
for pic in */*.jpg
do
make_thumbnail "$pic"
done