ImageMagick на несколько файлов

9

Я преобразовал один файл из BMP в PNG с помощью ImageMagick, convertиспользуя команду ниже

convert CD\ Front.bmp CD\ Front.png

У меня много таких файлов, поэтому я попробовал:

for f in */*.bmp ; do convert $f ${f%bmp}png; done

но эта команда висит навсегда.

Что я делаю неправильно?

user54619
источник

Ответы:

12

Скорее всего, у вас проблема, потому что вы не цитируете имена файлов:

for f in */*.bmp ; do convert "$f" "${f%bmp}png" ; done
#                             ^  ^ ^           ^

сделайте так, чтобы пространство в именах файлов не вызывало проблем.

Zelda
источник
3
$fследует также цитировать
Мат
Вы правы, спасибо за указание
Зельда
1
Кавычки переменных правильны, но если вы заключите в кавычки глобус, то оболочка будет искать литерал */*.bmp.
evilsoup
Спасибо и тебе. Я должен попробовать свои решения перед публикацией ...
Zelda
1

Я бы рефакторинг кода, как это. Я считаю этот метод более понятным и более легким для отладки:

find . -type f -name '*.bmp' |\
  while read BMP
  do
    DIR=$(dirname "$BMP")
    PNG="$(echo $BMP | sed 's/.bmp//g')"
    convert "${BMP}" "${PNG}".png
  done
JakeGould
источник
1
Я взял на себя смелость изменить JPEG в PNG при просмотре
Anthon
Ах, спасибо. Но это сработало и для JPEG!
JakeGould
1
Да, думаю, это так, но это было не то, о чем просил ОП ;-)
Anthon
Не используйте find | while read, особенно когда шарика будет достаточно.
Кевин
И Sed будет лучше, чем 's/\.bmp$/.png/', очевидно, удалить .png из фактической команды
Кевин