Як перейменувати / витягнути файли з довгими іменами в 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пакету.

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

Виконайте цю команду:

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

Ви перейменували їх усіх, ви також можете написати простий сценарій, який зробить це автоматично для вас.


Це неймовірно корисно, дякую! Я не міг змусити приклад zipnote працювати - і перший видаляє розширення файлу - але це досить добре для того, що мені потрібно зробити. Дякую!
Теренс Едем

Я оновив відповідь, тепер це збереже також розширення;)
Ravexina

Ви повинні використовувати, IFS= read -r iякщо імена файлів починаються з пробілу або містять речі, які оболонка може інтерпретувати як послідовності втечі.
Девід Фоерстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.