Работа с файлами формата OpenDocument
Начнем с хорошего - контейнером является все-таки стандартный zip-архив, а не что-то доморощенное. Теперь о плохом - это zip-архив и имеет все его недостатки. Поговорим о том, как же нам сделать редактирование контента для целей, например, автоматизированного вывода на печать документов - распаковываем файл content.xml, выполняем в нем нужные замены с помощью sed или другой утилиты, записываем измененный файл обратно в архив.
Две основные проблемы при работе с zip-архивами: утилита zip написана страшными голово...ногими существами с неизвестной планеты и сообщения об ошибках в архиве пишет в stdout (при запуске zip -T ...). Повбивав бы... Кроме того, не умеет заменять файл в архиве, принимая сам файл в stdin, а его имя - аргументом командной строки.
Решение первой проблемы - утилита unzip:
Ошибки отправляются в stderr, что и требовалось.
Решение второй проблемы - утилита zipput:
Эта замечательная утилита была придумана вчера, в процессе обсуждения subj с Anton Kovalenko, который тут же написал реализацию, а я ее сразу опакетил, так что уже можно брать в моем репозитории. Подробности см. на страничке автора zipput. Отмечу лишь, что libzip и zip в debian lenny некорректно работают с OpenDocument файлами, так что я сразу сделал и бэкпорт соответствующих пакетов из testing, с которыми все работает как полагается (в changelog новой версии указано "Add patch to support archives with 64k entries").
Две основные проблемы при работе с zip-архивами: утилита zip написана страшными голово...ногими существами с неизвестной планеты и сообщения об ошибках в архиве пишет в stdout (при запуске zip -T ...). Повбивав бы... Кроме того, не умеет заменять файл в архиве, принимая сам файл в stdin, а его имя - аргументом командной строки.
Решение первой проблемы - утилита unzip:
$ time unzip -qqt 100.odt
real 0m0.006s
user 0m0.004s
sys 0m0.000s
$ time unzip -qqt 100 >/dev/null
warning [100]: 3 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 3
(attempting to re-compensate)
Pictures/10000000000000AA000000528155B835.png: mismatching "local" filename (),
continuing with "central" filename version
Pictures/10000000000000AA000000528155B835.png: ucsize 174417162 <> csize 5130 for STORED entry
continuing with "compressed" size value
Pictures/10000000000000AA000000528155B835.png bad CRC d80cc663 (should be c116ead1)
file #11: bad zipfile offset (local header sig): 5746
(attempting to re-compensate)
real 0m0.006s
user 0m0.000s
sys 0m0.004s
Ошибки отправляются в stderr, что и требовалось.
Решение второй проблемы - утилита zipput:
echo "hello" | zipput test.odt content.xml
Эта замечательная утилита была придумана вчера, в процессе обсуждения subj с Anton Kovalenko, который тут же написал реализацию, а я ее сразу опакетил, так что уже можно брать в моем репозитории. Подробности см. на страничке автора zipput. Отмечу лишь, что libzip и zip в debian lenny некорректно работают с OpenDocument файлами, так что я сразу сделал и бэкпорт соответствующих пакетов из testing, с которыми все работает как полагается (в changelog новой версии указано "Add patch to support archives with 64k entries").
Comments