다음을 수행하는 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
입니다 .find
sh
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
답변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