1

У меня есть командный файл, который переименовывает файлы.

Можно ли переименовать файлы в ZIP-файле? Если нет, возможно ли их "извлечь" в фоновом режиме, переименовать и "добавить" обратно в тот же ZIP-архив?

4 ответа4

1

В формате Zip хранятся метаданные и данные отдельно для каждой записи. Таким образом, это позволит вам перебирать записи и изменять имя записи на лету, не распаковывая / сжимая данные, с эффективностью потоковой передачи, памяти и диска.

Я не знаю инструмента, предлагающего его из коробки, поэтому вам придется использовать библиотеку, такую как libzip, и связать ее с вашим любимым языком.

Поэтому, если ваши zip-архивы маленькие, и вы не выполняете эту задачу снова и снова, вам следует придерживаться процесса извлечения / переименования / архивирования.

1

Уже немного поздно, но так как это сработало для меня, я поделюсь своими выводами из:

http://www.info-zip.org/FAQ.html#rename

В основном вы должны использовать утилиту zipnote.

Example:
     zipnote foo.zip > foo.tmp
     ed foo.tmp
     ... then you edit the comments, save, and exit ...
     zipnote -w foo.zip < foo.tmp

"@ name" can be followed by an "@=newname" line to change the name

Он по-прежнему будет перезаписывать весь файл, но на один шаг меньше, чем извлечь файл, переименовать, удалить файл из zip, добавить переименованный файл обратно.

0

Вы можете извлечь -> переименовать -> сжать, как предложено выше, или вы можете отредактировать шестнадцатеричные данные почтового индекса, чтобы изменить имена внутри файла

Пример:eg1

Очевидно, что это намного сложнее сделать с пакетной обработкой, чем с извлечением, переименованием и сжатием, но если вы должны переименовать его, пока он еще находится в zip-архиве, это возможно, поскольку фактическое имя файла существует в .zip, Вы также можете преобразовать исходное имя в шестнадцатеричное, найти этот шестнадцатеричный массив в файле и заменить его новым.

0

Вы можете использовать версию 7-zip для командной строки

Например:

7z e archive.zip -o C:\Temporary\Dir
ren C:\Temporary\Dir\*.* *.renamed
7z a archive.zip C:\Temporary\Dir\* -aoa -y -sdel

e обозначает Extract, -o - выходной каталог.
Затем вы ren файлы внутри (используя все, что у вас есть в вашем пакетном скрипте на данный момент).
Наконец, мы a дд * (все) файлы из C:\Temporary\Dir обратно в тот же archive.zip но так как они существуют, мы хотели бы переписать все -aoa и убедитесь , что мы согласны -y в любые подсказки (в случае, если они появляются).
Да, и потому что нам нравится делать его чистым, -sdel гарантирует, что все файлы, которые были добавлены в архив, удалены.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .