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 资源
使用 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)