У меня есть сценарий, который следует.
Файлы для обработки хранятся в файле 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
Судя по строке с ошибкой ( ': Нет такого файла ...
вместо ' filename ': Нет такого файла ...
), проблема, вероятно, заключается в вашем images.txt
, строки которого завершаются CR-LF (то есть images.txt
происходит из мира Windows).
Из-за этого ваша строка
переменная (имя файла) заканчивается неправильным CR
(возврат каретки) (такого файла нет ...). Более того, когда он отображается на экране, из-за встроенного управляющего символа CR
печать продолжается с начала строки и перезаписывает имя файла.
Измените формат images.txt
так, чтобы его строки заканчивались LF (например, используйте утилиту dos2unix
), или отфильтруйте завершающий CR в bash.
[обновление] Если вы решите отфильтровать CR в bash, в идеале вы можете сделать следующее:
read -r -d $ '\ r' line
read -r line
: line = $ {line% $ '\ r'}