我希望在电视上展示我的照片集。为了做到这一点,我需要调整照片大小以适合 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
这将处理jpg
和JPG
文件,但请注意,所有拇指都将最终为.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