我使用以下脚本来转换所有jpg
图像png
:
# absolute path to image folder
FOLDER="/home/*/public_html/"
# max width
WIDTH=1280
# max height
HEIGHT=720
#resize png or jpg to either height or width, keeps proportions using imagemagick
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
但今天我跑步时感到震惊
ls -l
发现所有照片都被修改了,数据也被改变了,无论大与否
Oct 28 11:18 /home/photos/20210321/T161631305496ece25372fc18a9239da7911ac7c0dd056 (2).jpg
所以我正在考虑使用一个if
条件首先检查图像的路径,然后如果 WIDTH 大于 1280px 则运行convert
。否则什么也不做。
更新2
我构建了这个脚本
#!/bin/bash
for i in /root/d/*.jpg; do
read -r w h <<< $(identify -format "%w %h" "$i")
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
fi
done
所以我看得find
更清楚了for
。
for
没有搜索所有文件夹和子文件夹。
更新3
WIDTH=1280
HEIGHT=720
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read img; do \
anytopnm "$img" | pamfile | \
perl -ane 'exit 1 if $F[3]>1280' || convert "$img" -verbose -resize "${WIDTH}x${HEIGHT}>" "$img"; \
done
效果很好,但我明白了
jpegtopnm: WRITING PPM FILE
当没有图像时> 1280
答案1
命令的主要问题convert
是参数$WIDTHx$HEIGHT\>
尝试扩展名为 的变量$WIDTHx
。由于此变量不存在,因此使用的参数-resize
将是任何参数$HEIGHT\>
(与 using 相同"${HEIGHT}x$HEIGHT>"
)。您可以使用 来修复此问题-resize "${WIDTH}x$HEIGHT>"
。这是您的两个命令中的问题find
。
要缩小太大的图像,您可以使用类似的东西
#!/bin/sh
w=1280
h=720
find /home/*/public_html -type f \( -iname '*.jpg' -o -name '*.png' \) \
-exec convert -resize "${w}x${h}>" {} \;
就我个人而言,我只会从最新的备份中恢复图像,因为像这样上下缩放图像必然会大大降低其质量。
测试时,先在较小的图像副本上运行,然后再让脚本在整个图像集合上运行。还要确保您的备份按预期运行。
答案2
很抱歉我不清楚,我找到并构建了我的最终脚本,并希望用聪明的一个来纠正 Q 的标题
脚本搜索文件jpg
或png
如果找到则检查宽度如果发现大于 1280 将转换
#!/bin/bash
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read i; do \
read -r w h <<<$(identify -format "%w %h" "$i")
if [ $w ]; then
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize ${WIDTH}x${HEIGHT}\> \{} \;
fi
fi
done