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


9

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

convert CD\ Front.bmp CD\ Front.png

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

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

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

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

Ответы:


12

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

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

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


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

1
Я взял на себя смелость изменить JPEG в PNG при просмотре
Anthon

Ах, спасибо. Но это сработало и для JPEG!
JakeGould

1
Да, думаю, это так, но это было не то, о чем просил ОП ;-)
Anthon

Не используйте find | while read, особенно когда шарика будет достаточно.
Кевин

И Sed будет лучше, чем 's/\.bmp$/.png/', очевидно, удалить .png из фактической команды
Кевин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.