如何使用 Image Magic 并行批量转换多个子目录中的 1000 张图像

Mil*_*les 5 linux parallel-processing bash imagemagick xargs

我有 ~100 个子目录,每个子目录有 ~1000 个文件,我想转换JPG为在ie下PNG使用。我的脚本很慢,我可以加快速度吗?Image MagickBASH for Win10LINUX script

find . -type f -name '*.jpg' -exec sh -c '
    orgfile="$0"
    newfile="$(echo "$0" | sed 's/.jpg/.png/')"
    echo $orgfile $newfile
    convert $orgfile -unsharp 0x5 $newfile
    rm $orgfile
' {} \;
Run Code Online (Sandbox Code Playgroud)

我喜欢循环过程,因为转换是许多过程中的第一个,因此输入和输出名称可以重复使用。然而,它的速度很慢,并且有回声可供反馈(更改为每个目录?)

在相关帖子中给出了以下解决方案

# Runs these conversions serially
ls *.NEF | sed 's#.NEF##' | xargs -I^ convert ^.NEF ^.jpg
# Runs these conversions with 8 different processes
ls *.NEF | sed 's#.NEF##' | xargs -P8 -I^ convert ^.NEF ^.jpg
Run Code Online (Sandbox Code Playgroud)

但另一篇文章警告说,并行处理可能会减慢系统速度

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level
Run Code Online (Sandbox Code Playgroud)

我认为我在高级 BASH 脚本和并行处理中迷失了方向,而且我不知道xargs.

BTW 串行运行使用了大约 25% 的 PC 资源

Ipo*_*cer 2

使用 imagemagick 的内联批处理,称为 mogrify

mogrify -unsharp 0x5 -format png *.jpg
Run Code Online (Sandbox Code Playgroud)

在 shell 中你不可能写得更快。对于递归转换,请使用 bash 通配功能:

shopt -s globstar
mogrify -unsharp 0x5 -format png **/*.jpg
Run Code Online (Sandbox Code Playgroud)