Как переименовать / извлечь файлы с длинными именами в zip-архиве

11

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

Если я пытаюсь извлечь из командной строки, я получаю сообщение об ошибке «Имя файла слишком длинное».
Если я использую графический менеджер архивов, он не извлечет файлы и не позволит мне переименовать их. Та же проблема возникает, если я монтирую архив.

Я могу извлекать и переименовывать файлы по отдельности, используя:

unzip -p -c example.zip "long file name.ogg" > shortname.ogg

Это нецелесообразно с большим количеством файлов.

Есть ли инструмент, который будет обрезать имена файлов по мере их извлечения?

Теренс Иден
источник
Каков вывод unzip -l <ARCHIVE>и как вы хотите, чтобы имена были усечены? Вы хотите сохранить структуру каталогов внутри архива во время извлечения?
Дэвид Фёрстер

Ответы:

13

Извлекать

Мы можем использовать zipinfoкак часть этого процесса, это программа из zipпакета.

zipinfo -2 example.zip

будет отображать только имена файлов example.zip, что-то похожее на:

file1-long-name-...-bla-bla.html
file2-long-name-...-bla-bla.html

поэтому мы можем использовать эту функцию для извлечения всех файлов:

zipinfo -2 example.zip | while read i;
do
  long_fname=${i%.*}
  unzip -p -c example.zip "$i" > "${long_fname:0:250}.${i##*.}"
done;
  • long_fname=${i%.*}: Удаляет расширение из длинного имени файла, поэтому в случае, если имя файла меньше 256 символов; Мы не собираемся получить дубликат расширения.
  • ${long_fname:0:250}.${i##*.}: Создает новое имя файла с допустимым количеством символов, а также добавляет .реальное расширение файла.

Просто мы зацикливаемся на списке файлов и извлекаем каждое из них с новым допустимым именем файла, которое состоит из 256 символов.


Переименовать

Вы можете использовать zipnoteкоманду, это тоже часть zipпакета.

Сначала получите резервную копию вашего zip-файла.

Запустите эту команду:

zipnote example.zip > names

Откройте имена с помощью редактора, это выглядит так:

@ file name long in zip and a lot of other strings in the file name
@ (comment above this line)
@ (zip file comment below this line)

Добавьте новые имена файлов, как это:

@ file name long in zip and a lot of other strings in the file name
@=new short name for above file
@ (comment above this line)
@ (zip file comment below this line)

Затем для переименования файлов используйте:

zipnote -w example.zip < names

Вы переименовали их все, вы также можете написать простой скрипт, который сделает это автоматически для вас.

Ravexina
источник
Это невероятно полезно, спасибо! Я не смог заставить работать пример zipnote - и первый удаляет расширение файла - но этого достаточно для того, что мне нужно сделать. Спасибо!
Теренс Иден
Я обновил ответ, теперь он тоже сохранит расширение;)
Ravexina
Вы должны использовать, IFS= read -r iесли имена файлов начинаются с пробела или содержат вещи, которые оболочка может интерпретировать как escape-последовательности.
Дэвид Фёрстер