파일에서 읽은 파일 이름이 올바른 값을 얻지 못함

파일에서 읽은 파일 이름이 올바른 값을 얻지 못함

아래와 같은 스크립트가 있습니다.

처리할 파일은 images.txt한 줄씩 읽는 파일에 저장됩니다. 첫 번째 echo명령은 파일 이름을 올바르게 표시하지만 후속 ImageMagick 명령은 이미지 처리에 실패하고 파일을 찾을 수 없다는 메시지를 표시합니다. 왜?

#!/bin/bash
filename="images.txt"
while read -r line
do
echo "line is $line"
# width
width="$( identify -format "%w" "$line" )" 
# height
height="$( identify -format "%h" "$line" )"
echo "$width X $height "
exit 1
if [ $width -lt 250 -a $height -lt 250 -a $width -lt $height ]
then
    echo "1"        
    convert $line -resize 250 $line

elif [ $width -lt 250 -a $height -lt 250 -a $width -gt $height ]
then
    echo "2"        
    convert $line -resize x250 $line
elif [ $width -lt 250 ]
then
    echo "3" 
    convert $line -resize 250 $line
elif [ $height -lt 250 ]
then
    echo "4"
    convert $line -resize x250 $line
else
    echo "All is Well" 
fi
done < "$filename"

산출:

line is v/347/l_ib-dfran035__62594_zoom.jpg
': No such file or directory @ error/blob.c/OpenBlob/2589._zoom.jpg

답변1

오류 줄( ': No such file...아님 )로 판단하면 줄이 CR-LF로 끝나는 파일(즉, Windows 세계에서) 'filename': No such file...에 문제가 있을 수 있습니다 .images.txtimages.txt

따라서 line변수(파일 이름)는 CR(캐리지 리턴)으로 끝나는데 이는 잘못된 것입니다(해당 파일이 없습니다...). 또한 화면에 표시되면 CR줄의 처음부터 인쇄가 계속되며 내장된 제어 문자로 인해 파일 이름을 덮어씁니다.

images.txt해당 행이 LF로 끝나도록 형식을 변경하거나 ( dos2unix예: 이 유틸리티 사용) bash에서 후행 CR을 필터링합니다.

[업데이트] Bash에서 CR을 필터링하도록 선택한 경우 다음 중 하나를 수행하는 것이 좋습니다.

  • read -r -d $'\r' line
  • 또는 바로 다음 장소에서 read -r line:line=${line%$'\r'}

관련 정보