JPG 批量压缩和重命名(查找 -exec、xargs、管道?)

JPG 批量压缩和重命名(查找 -exec、xargs、管道?)

这是我的第一篇帖子,所以如果我犯了一些格式错误,我希望你能原谅我,否则。这是我很久以来一直存在的一个问题,在寻找答案的过程中,我又出现了更多的问题。我试图找到一种方法,使用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

相关内容