ファイルから読み取ったファイル名が正しい値を取得できない

ファイルから読み取ったファイル名が正しい値を取得できない

以下のスクリプトがあります。

処理するファイルは、images.txt1行ずつ読み取るファイルに保存されます。最初の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 lineline=${line%$'\r'}

関連情報