가로 이미지와 세로 이미지를 분리하고 이동하는 쉘 스크립트

가로 이미지와 세로 이미지를 분리하고 이동하는 쉘 스크립트

이미지 디렉토리가 있습니다 jpg. 모든 가로 이미지를 하나의 디렉토리로 이동하고 모든 세로 이미지를 다른 디렉토리로 이동하는 쉘 스크립트가 있습니까( bash또는 zsh허용됩니까)?

답변1

비율 확인과 같이 높이와 너비를 비교하기 위해 특수 연산자 와 함께 imagemagicks를 사용할 수 있습니다 .identifyfxh/w

for f in ./*.jpg
do
  r=$(identify -format '%[fx:(h/w)]' "$f")
  if (( r > 1 )) 
  then
      mv "$f" /path/to/portraits
  elif  (( r < 1 ))
  then
      mv "$f" /path/to/landscapes
  fi
done
# mv ./*.jpg /path/to/squares

이렇게 하면 현재 디렉터리에 정사각형 이미지가 유지됩니다. 마지막 줄의 주석 처리를 해제하여 해당 디렉터리로 이동하세요. 또는 가로 또는 세로 방향으로 포함하려면 비교 연산자 중 하나를 <=또는 로 변경하세요 >=.

답변2

ImageMagick 사용 identify:

#! /bin/sh                                            
identify -format '%w %h %i\n' -- "$@" 2>/dev/null | \
    while read W H FN; do
        if [ $W -gt $H ]; then
            echo mv -f -- "$FN" /path/to/landscape/
        else
            echo mv -f -- "$FN" /path/to/portraits/
        fi
    done

이는 mv파일 단위로 실행되므로 특별히 효율적이지는 않지만 효율성을 요구하지는 않습니다.

답변3

유틸리티를 사용하여 fileinfo이미지의 너비와 높이를 가져옵니다. 높이가 너비보다 크면 파일이 portraits/디렉터리로 이동됩니다. 그렇지 않은 경우 해당 landscape/디렉터리로 이동합니다.

for f in ./*jpg
do
    if fileinfo "$f" 2>&1 | awk '/w =/{w=$3+0; h=$6+0; if (h>w) exit; else exit 1}'
    then
        mv "$f" portraits/
    else
        mv "$f" landscape/
    fi
done

이 루프의 파일 이름은 필요할 때 큰따옴표로 묶여 있으므로 공백, 줄 바꿈 또는 기타 어려운 문자가 포함된 이미지 파일 이름에도 이 루프를 사용하는 것이 안전합니다.

Debian 계열 시스템에서는 다음을 fileinfo통해 설치할 수 있습니다.

apt-get install leptonica-progs

awk 명령을 적절하게 수정하는 한 다른 유사한 유틸리티를 사용할 수 있습니다.

답변4

다른 해결 방법에서 산술 오류가 발생하는 경우 이 해결 방법을 시도해 보십시오.

#/bin/zsh
mkdir -p portraits
mkdir -p landscapes
for f in ./*.jpg
do
  r=$(identify -format '%[fx:(h/w)]' "$f")
  if [[ r < 1.0 ]] 
  then
      echo "Portrait detected."
  mv "$f" ./portraits/
  elif  [[ r > 1.0 ]]
  then
  echo "Landscape detected."
      mv "$f" ./landscapes/
  fi
done

관련 정보