폴더(하위 폴더 포함)에 있는 모든 사진의 크기를 일괄 조정하는 방법은 무엇입니까?

폴더(하위 폴더 포함)에 있는 모든 사진의 크기를 일괄 조정하는 방법은 무엇입니까?

내 서버에는 다양한 하위 폴더의 이미지로 가득 찬 12GB의 거대한 갤러리가 있습니다. 이 파일은 너무 커서 전체 해상도로 사용할 수 없습니다. 모든 이미지의 크기를 너비 820픽셀로 조정해야 합니다(비율 유지). 그래서 내 질문은 - 820px보다 큰 모든 이미지의 크기를 조정하고 원본 파일을 덮어쓰며 다시 저장하는 일종의 크롤링 스크립트를 어떻게 만들 수 있습니까?

당신이 나를 도울 수 있기를 바랍니다 :-) 미리 감사드립니다.

답변1

ImageMagick 도구가 작업을 수행 convert할 수 있습니다 .mogrify

패키지 관리자나 소스/rpm을 통해 얻을 수 있습니다.여기.

기본 사용법(원본 파일을 덮어씁니다):

$ mogrify -resize 820x ./*.jpg

재귀가 필요한 경우:

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

답변2

이 스크립트는 .png폴더의 모든 파일 크기를 30%로 조정합니다. 원본 파일을 삭제하거나(인 경우 delete_original) true보관할 수 있습니다. 이 경우 크기가 조정된 파일에는 이름 접미사가 붙습니다 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

관련 정보