这是我的第一篇帖子,所以如果我犯了一些格式错误,我希望你能原谅我,否则。这是我很久以来一直存在的一个问题,在寻找答案的过程中,我又出现了更多的问题。我试图找到一种方法,使用convert
一个命令来压缩文件夹中的图片。
首先我只是尝试:
convert * -resize 50% Pic.jpg
但是,这返回了名为 Pic-0.jpg、Pic-1.jpg 等的压缩图片。(我也尝试了,$(find ".JPG")
但这*
扩展为相同。为了获得我想要的格式,我尝试了:
convert * -resize 50% Pic_lorez_{1..3}.jpg
但这似乎将 Pic_lorez_2.jpg 和 Pic3_lorez_3.jpg 作为输入文件,而不是输出文件。因此,根据朋友的建议,我尝试了:
find . -name "*.JPG" -exec convert {} -resize 50% {} \;
这会压缩同一名称下的所有文件,但不允许将这些文件命名为我想要的名称(例如,Pic_lorez_{1,2,3,4,5,..100}.jpg)。
xargs 能实现这个功能吗?类似这样的:
find . -name "*.JPG" | xargs convert ???
我无法弄清楚 xargs 的正确语法。我最终尝试将 find 直接放入 convert 中,但 convert 似乎无法以这种方式工作。
答案1
convert
写入不同的图像文件。要覆盖原始图像文件,请使用mogrify
。
单个文件:
mogrify -resize 50% Pic.jpg
全部.jpg
文件:
mogrify -resize 50% *.jpg
答案2
您可以使用这个衬垫:
for img in $(ls *.jpg); do convert $img -resize 50% $img;done;
答案3
尝试这个:
SIZE=50 ; find -iname "*.jpg" | while read line ; do NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE\1/")" ; convert "$line" -resize $SIZE% "$NF" ; done
这实际上不只是一行。以下是缩进版本:
SIZE=50
find -iname "*.jpg" | while read line ; do
NF="$(echo $line | sed -r "s/(\.jpg|\.JPG)/_$SIZE\1/")"
convert "$line" -resize $SIZE% "$NF"
done
您可以将值调整SIZE
为任何其他大小(以百分比为单位)。
请注意,第一次运行后,它还会将已转换的文件作为输入文件。您可以_NUMBER.jpg
通过修改 find 参数跳过名为的文件,也可以将转换后的文件存储在其他地方。
答案4
使用 GNU Parallel:
find -iname "*.jpg" | parallel convert {} -resize 50% {.}_50pct.jpg
并获得额外的好处,使所有 CPU 核心并行工作,从而加快进程。
10秒安装:
wget pi.dk/3 -qO - | sh -x
观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1