이미지의 수집된 픽셀 크기를 가져오는 쉘 스크립트

이미지의 수집된 픽셀 크기를 가져오는 쉘 스크립트

총 픽셀 크기 중 가장 큰 이미지를 반환하는 쉘 스크립트를 생성하려고 합니까?

예를 들어:

나는 각각 이미지가 포함된 7000개가 넘는 디렉토리를 가지고 있습니다.

dir_1/
picture_1.png = 800x600
picture_2.png = 80x100
picture_3.png = 80x640
picture_4.png = 500x630

dir_2/
p_1.png = 800x600
p_2.jpeg = 800x1000
p_3.png = 180x1640
p_4.gif = 500x30

따라서 예상되는 결과는 다음과 같습니다.

 the largest one in dir_1 is: picture_1.png 
 the largest one is dir_2 is: p_2.png 

그래서 숫자를 수집한 후 전체 크기를 알아내는 것이 가장 좋은 방법이라고 생각했습니다. 그래서 sips 명령을 사용하여 숫자를 수집할 수 있는 bash 스크립트를 만들어 보았습니다.

여기 예:

 for f in *;
 do
 far=$( cd $f/OEBPS/image/ | ls * | egrep 'jpg|png|jpeg')

 W=$( sips -g pixelWidth $far | cut -f 2 -d":" )
 H=$( sips -g pixelHeight $far | cut -f 2 -d":" )

 coll=$(expr $W + $H)
 echo $f total is: $coll
 cd -
 done

하지만 결과는 틀렸습니다.

어떤 아이디어나 더 좋은 방법이 있나요?

답변1

한 단계로 높이와 너비를 얻는 방법은 다음과 같습니다.

IFS=x read w h < <(identify "$file" | grep -oP '\d+x\d+(?=\+)')

identifyImageMagick 패키지의 일부입니다.

귀하의 "$far"는 귀하가 원하는 것이 아닙니다.

for dir in */OEBPS/image/; do
    for image in "$dir"/*.{jpg,png,jpeg}; do
        IFS=x read w h < <(identify "$image" | grep -oP '\d+x\d+(?=\+)')
        echo $((w*h)) "$image"
    done | sort -n | tail -1 | {
        read size file
        echo "largest in $dir is $file"
    }
done

실제로 identify여러 파일을 사용할 수 있으므로 보다 효율적인 기술은 다음과 같습니다.

for dir in */OEBPS/image/; do
    identify "$dir"/*.{jpg,png,jpeg} |
    awk '{split($(NF-6), a, /x/); split($0, b, /[[]/); print a[1]*a[2], b[1]}' |
    sort -n | tail -1 | {
        read size file
        echo "largest in $dir is $file"
    }
done

awk 명령은 공백이 포함될 수 있는 이미지 이름을 처리해야 하기 때문에 약간 복잡합니다.

답변2

#!/bin/bash
file=""
max=0
for f in /OEBPS/image/*{png,jpg,jpeg}
do
  id=$(identify "$f") 
  size=$(echo ${id} | sed -r 's/.* (JPEG|PNG) ([0-9]+)x([0-9]+) .*/\2*\3/')   
  area=$(($size))
  if (( area >= max ))
  then
    max=$area
    file="$f"
  fi
done
echo $max $file
  • 사용하지 마세요엘에스스크립트에서 파일을 반복하는 경우 파일 이름에 공백이 있으면 이를 방지할 수 있습니다.
  • 아니요CD에 대한.
  • 지역별로 가장 큰 파일을 찾기 위해 정렬이 필요하지 않습니다.
  • Bash에서 산술을 수행하려면 필요하지 않습니다.표현, 그러나 $((a*b)).

요구 사항 결정이미지 마술사.

이것sed- 파일 이름이 출력과 너무 가까워 보이면 명령이 실패합니다.확인하다.

관련 정보