ImageMagick на нескольких файлах

Существуют на Солярисе x86-64 некоторые очень большие файлы, размер которых превышает 263, то есть, максимальный размер, представимый в off64_t. Это включает файл, представляющий адресное пространство процесса в proc (/proc/<pid>/as).

Иметь дело с этими файлами:

  1. Не использовать fopen, fseek, и т.д. не доверяйте libc потоковым стандартным программам, которые (на версиях Соляриса я протестировал), искажают плохо "недопустимые" смещения.
  2. Использовать open64, read.
  3. Искать:

    static off64_t lseeku64(int file, uint64_t offset /* eg from pr_argv */)
    {
    #ifndef __sun
      if (offset > 0x7FFFFFFFFFFFFFFFllu) return -1;
    #endif
      return lseek64(file, offset, SEEK_SET);
    }
    

    Таким образом, на Солярисе мы знаем, что можем сделать этот бросок из-за контроля источников OpenSolaris, но мы должны постараться не предполагать, что он работает над другими платформами с psinfo и pr_argv (например, AIX).

    Но, передайте в своем очень большом смещении, и оно действительно все "просто работает".

8
16.12.2013, 00:28
3 ответа

У Вас, скорее всего, есть проблема, потому что Вы не заключаете имена файлов в кавычки:

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

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

12
27.01.2020, 20:08
  • 1
    $f должен быть заключен в кавычки также –  Mat 15.12.2013, 12:50
  • 2
    Вы правы, спасибо за указание –  Zelda 15.12.2013, 13:00
  • 3
    , Заключающие переменные в кавычки, корректно, но если Вы заключите шарик в кавычки затем, то оболочка будет искать литерал */*.bmp. –  evilsoup 15.12.2013, 14:04
  • 4
    Благодаря Вам также. Я должен испытать свои решения прежде, чем отправить... –  Zelda 15.12.2013, 14:26

Можно использовать mogrify:

mogrify -format png *.bmp

Источник: веб-сайт Imagemagick

18
27.01.2020, 20:08

Я осуществил бы рефакторинг код как это. Я нахожу, что этот метод является более четким и легче отладить:

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
27.01.2020, 20:08
  • 1
    я брал на себя смелость для изменения JPEG в PNG при рассмотрении –  Anthon 15.12.2013, 19:09
  • 2
    Ahh, спасибо. Но это действительно работало на JPEG также! –  JakeGould 15.12.2013, 19:10
  • 3
    Да, угадайте, что это делает, но это не было тем, что OP, который попросили ;-) –  Anthon 15.12.2013, 19:21
  • 4
    Не использовать find | while read, особенно, когда шарик будет достаточен. –  Kevin 15.12.2013, 20:17
  • 5
    И sed был бы лучше как 's/\.bmp$/.png/', затем, очевидно, удалите .png из фактической команды –  Kevin 15.12.2013, 20:19

Теги

Похожие вопросы