是否有一个 Linux 命令可以仅通过一个步骤批量优化多个图像文件?

是否有一个 Linux 命令可以仅通过一个步骤批量优化多个图像文件?

我的文件夹中有一堆图像:

images/image1.jpg
images/image2.jpg
...

这些图像并未针对网络进行优化。

只是想知道是否存在一个 Linux 命令可以仅通过一个步骤批量优化这些图像?

更新:我需要为每张图片做两件事:

  1. 如果图像的宽度大于 900px,则将宽度减小到 900px(保持比例)

  2. 以较低的质量保存文件,比如说原始文件的 70%。

答案1

安装图像魔术师

sudo apt-get install imagemagick

并使用convert以下命令:

mkdir new
for file in images/*jpg
do convert -quality 70% -resize '>900x' "$file" new/$(basename "$file")
done

答案2

如果您有很多文件,并且想要快速完成此操作,您也可以使用并行程序:

sudo apt install imagemagick parallel

然后是以下内容:

find . \( -name '*.jp*g' -o -name '*.png' \) -a ! -name '*.min.*' -type f -print0 | \
parallel -0 'convert {} -resize '>900x' -quality '70%' \
    -set filename:newname "%d/%[basename].min.%[extension]" "%[filename:newname]"'

让我们来看一下:

  • find-- 查找文件
    • .-- 在当前目录中
    • \( -name '*.jp*g' -o -name '*.png' \)— 要么是 png 要么是 jpeg(“jpg”和“jpeg”都是常见的扩展名!)
    • -a ! -name '*.min.*'-- 并跳过已最小化的文件
    • -type f——是实际的文件,而不是符号链接或名称奇怪的目录
    • -print0-- 打印这些文件并用空字节分隔(这样空格就不会破坏内容)
  • parallel-- 从上一个命令读取并针对每个元素并行执行该命令
    • -0-- 每个元素用空字节分隔
    • convert {}-- 调用 imagemagick “convert” 程序,并将文件名替换为{}
      • resize '>900x' -quality '70%'-- 将图像大小调整为 x 轴上的最大 900px,并将 jpeg 质量更改为 70%。许多这里有其他可能的选择。
      • -set filename:newname "%d/%[basename].min.%[extension]"——用新文件名创建一个变量。请参阅文档以了解所有有效值
        • %d-- 文件所在的目录
        • %[basename]-- 不带任何扩展名的文件名
        • %[extension]-- 文件的原始扩展名
      • "%[filename:newname]"-- 我们在上一步中设置的输出文件名

相关内容