반복적으로 썸네일 생성 및 이동

반복적으로 썸네일 생성 및 이동

다음을 수행하는 bash 스크립트가 필요합니다.

  • 현재 디렉토리부터 아래쪽으로 이미지(jpg, jpeg, JPG, JPEG)를 반복적으로 검색합니다.
  • imagemagick의 변환을 사용하여 썸네일 생성
  • 축소판을 다른 디렉토리로 이동

내 현재 스크립트는 다음과 같습니다.

for f in `find . -type f -iname "*.jpg"`
  do
  convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
  mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/
done

공백/특수 문자가 포함된 파일(또는 모든 내용이 포함된 폴더)은 변환되지 않습니다. 나는 시도했지만 print0도움이 되지 않았습니다.

답변1

출력을 반복하지 마십시오 find. 귀하가 겪고 있는 문제는 이러한 상황의 전형적인 결과입니다.

귀하의 예는 파일 이름 바꾸기로 인해 약간 까다롭습니다. 매우 효율적이지는 않지만 안전한 접근 방식은 다음과 같이 파일당 추가 옵션을 사용하는 것 -exec입니다 .findsh

find . -type f -iname "*.jpg" -exec sh -c 'echo convert "$1" -resize 800x800\> /home/user/thumbs/"${1%.jpg}_thumb.jpg"' -- {} \;

동일한 이름을 사용하는 것이 괜찮다면( .jpg대신 접미사 사용 _thumb.jpg) 다음 간단한 형식이 작동하고 더 효율적입니다.

find . -type f -iname "*.jpg" -exec echo convert "{}" -resize 800x800\> /home/user/thumbs/"{}" \;

echo명령을 실행하기 전에 출력을 확인하기 위해 거기에 명령문을 추가했습니다 . 출력이 양호해 보이면 제거하세요.

답변2

다음과 같은 고급 옵션을 사용할 수 있습니다.-set결합하다탈출율( %t즉, 디렉토리나 확장자가 없는 파일 이름 추출) 각 파일은 단일 호출로 크기 조정, 이름 변경 및 이동할 수 있습니다 convert.

find . -type f -iname \*.jpg -exec convert {} -resize 800x800\> \
-set filename:name '%t' '/home/user/thumbs/%[filename:name]_thumb.jpg' \;

답변3

솔루션에서 파일 이름은 기본적으로 분할되어 있으며 $IFS공백을 포함합니다.

다음을 시도해 보십시오:

while IFS= read -rd '' f; do

    convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
    mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/

done < <(find . -type f -iname "*.jpg" -print0)

동일하게 설정한 구분 기호를 사용하여 find널 바이트( )로 구분된 파일 이름을 인쇄합니다 .\0-d ''read

관련 정보