我应该如何使用位于多个子目录中的原始图像批量缩略图?

问题描述:

我有原始图像中的目录结构,看起来像这样:我应该如何使用位于多个子目录中的原始图像批量缩略图?

./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)。

问题:

  1. 是否有从位于多个子目录图像创建缩略图的更好,更可靠的方法?
  2. 我可以使现有命令更加健壮(例如,但使用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