如何批量调整文件夹(包括子文件夹)中所有图片的大小?

如何批量调整文件夹(包括子文件夹)中所有图片的大小?

我的服务器上有一个巨大的 12GB 画廊,各个子文件夹中充满了图像。这些文件太大,无法以全分辨率使用。我需要将所有图像的大小调整为 820 像素宽(保持比例)。所以我的问题是 - 如何创建某种爬行脚本来调整所有大于 820px 的图像大小并将它们保存回覆盖原始文件?

希望你能帮助我:-) 提前谢谢你。

答案1

ImageMagick 工具convertmogrify将完成这项工作。

您可以通过包管理器或源/rpm 获取它们这里

基本用法(会覆盖原文件):

$ mogrify -resize 820x ./*.jpg

如果需要递归:

find . -name '*.jpg' -execdir mogrify -resize 820x {} +

答案2

该脚本将.png文件夹中的所有文件大小调整为 30%。原始文件可以被删除(如果delete_originaltrue),也可以保留,在这种情况下,调整大小的文件将获得名称后缀rename_postfix

#!/bin/bash

rename_postfix="-small"
delete_original=true
substr=".png"
for str in *.png; do
    #reverse strings
    reverse_str=$(echo $str | rev)
    reverse_substr=$(echo $substr | rev)
    
    #find index of reversed substring in reversed string
    prefix=${reverse_str%%$reverse_substr*}
    reverse_index=${#prefix}
    
    #calculate last index
    index=$(( ${#str} - ${#substr} - $reverse_index ))
    
    # Extract the filename without extension
    filename="${str:0:index}"
    if $delete_original; then
        # the name can remain, because the original will be removed
        new_filename="${str}"
    else
        # need a new name, two files will remain
        new_filename="${filename}${rename_postfix}${substr}"
    fi

    echo "extension = ${substr}, original = ${str}, filename = ${filename}, new = ${new_filename}"
    
    # Resize and convert the file to .jpg
    convert -resize 30% "${str}" "${new_filename}"
done

我认为您应该能够使用上述主体编写一个函数,该函数将接受目录参数等(如果您想让它进入子文件夹)

convert函数来自imagemagick库:

sudo apt install imagemagick

相关内容