递归缩略图创建到不同的目的地

递归缩略图创建到不同的目的地

我希望在电视上展示我的照片集。为了做到这一点,我需要调整照片大小以适合 1920x1080px 窗口(因为处理原件时性能很糟糕)。

我的预期结构是:

/path/to/originalphotos/
/path/to/originalphotos/2016/2016-01-01 Description/DSC_1234.JPG
/path/to/originalphotos/2019/2019-12-31 Description/DSC_5678.JPG

/path/to/thumbnails/
/path/to/thumbnails/2016/2016-01-01 Description/DSC_1234_thumb.JPG
/path/to/thumbnails/2019/2019-12-31 Description/DSC_5678_thumb.JPG

我正在尝试创建一个脚本,该脚本循环并创建相应子目录中每个文件的/path/to/originalphotos/缩略图(使用 Imagemagick 的convert实用程序) 。.JPG

到目前为止,我的 Bash 脚本如下所示:

#!/bin/bash
SOURCE_PATH="/path/to/originalphotos/"
DESTINATION_PATH="/path/to/thumbnails/"
find "$SOURCE_PATH" -type f -iname '*.jpg' -exec sh -c 'echo convert \"$1\" -auto-orient -resize 1920x1080\> --write \"$DESTINATION_PATH${0%}_thumb.JPG\"' -- {} \;

请注意,我添加是echo为了避免保存任何数据。

您能提供任何帮助来正确存储缩略图吗?

我有一种直觉,我稍后会遇到问题,因为我的一些文件夹名称包含特殊的丹麦字符(Æ、Ø、Å)。

答案1

我认为你的文件夹名称根本不会成为问题。但我建议使用 shell globbing 而不是find,只是为了使语法更简单。像这样的东西:

shopt -s globstar nullglob 
destination=/path/to/thumbnails
cd /path/to/originalphotos
for i in **/*{jpg,JPG}; do 
    dirName=${i%/*}
    file=$(basename "$i")
    fileName="${file%.*}"
    echo convert "$i" -auto-orient -resize 1920x1080\> \
        --write "$destination/${fileName}_thumb.JPG" 
done

这将处理jpgJPG文件,但请注意,所有拇指都将最终为.JPG,无论它们是.jpg还是.JPG最初。如果这是一个问题,你可以这样做:

for i in **/*{jpg,JPG}; do 
    dirName=${i%/*} 
    file=$(basename "$i")
    fileName="${file%.*}" 
    ext="${file##*.}" 
    echo convert "$i" -auto-orient -resize 1920x1080\> \
        --write "$destination/${fileName}_thumb.$ext"
done

相关内容