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弄清楚正确的语法。 我终于尝试了直接搜索转换,但转换似乎无法以这种方式工作。

convert写入convert为其他图像文件。 要覆盖原始图像文件,请使用mogrify

单个文件:

 mogrify -resize 50% Pic.jpg 

所有.jpg文件:

 mogrify -resize 50% *.jpg 

你可以用这个衬里: for img in $(ls *.jpg); do convert $img -resize 50% $img;done; for img in $(ls *.jpg); do convert $img -resize 50% $img;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=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的值调整为任何其他大小,以百分比表示。

请注意,在第一次运行后,它还将已经转换的文件作为输入文件。 您可以通过修改find​​参数来跳过名为_NUMBER.jpg的文件,也可以将转换后的文件存储在其他位置。

这个脚本会为你做!

将其保存在文件中,并使用以下命令使文件可执行: chmod +x filename

 #!/斌/庆典
 SAVEIFS = $ IFS
 IFS = $(echo -en“\ n \ b”)
 C = 0;
 DES = “./”;  #目标目录

 for img in`find。  -maxdepth 1 -mindepth 1 -iname'* .jpg'-type f`
做
     ((++ C));
     NF = “$ {DES} Pic_lorez _ $ {C} .JPG”;  #新文件名
    转换$ img -resize 50%$ NF;
 DONE

 #recovery $ IFS
 IFS = $ SAVEIFS
  • ./更改为要放置转换图像的目录,默认情况下将它们放在当前目录中。
  • Pic_lorez_更改为您要为转换后的文件指定的名称。

使用GNU Parallel:

 find -iname "*.jpg" | parallel convert {} -resize 50% {.}_50pct.jpg 

并获得额外的好处,让所有CPU核心并行工作,从而加快流程。

10秒安装:

 wget pi.dk/3 -qO - | sh -x 

观看介绍video以了解更多信息: https : //www.youtube.com/playlist?list = PL284C9FF2488BC6D1