У меня есть почтовый индекс, который содержит файлы с очень длинными именами.
Если я пытаюсь извлечь из командной строки, я получаю сообщение об ошибке «Имя файла слишком длинное».
Если я использую графический менеджер архивов, он не извлечет файлы и не позволит мне переименовать их. Та же проблема возникает, если я монтирую архив.
Я могу извлекать и переименовывать файлы по отдельности, используя:
unzip -p -c example.zip "long file name.ogg" > shortname.ogg
Это нецелесообразно с большим количеством файлов.
Есть ли инструмент, который будет обрезать имена файлов по мере их извлечения?
unzip -l <ARCHIVE>
и как вы хотите, чтобы имена были усечены? Вы хотите сохранить структуру каталогов внутри архива во время извлечения?Ответы:
Извлекать
Мы можем использовать
zipinfo
как часть этого процесса, это программа изzip
пакета.будет отображать только имена файлов
example.zip
, что-то похожее на:поэтому мы можем использовать эту функцию для извлечения всех файлов:
long_fname=${i%.*}
: Удаляет расширение из длинного имени файла, поэтому в случае, если имя файла меньше 256 символов; Мы не собираемся получить дубликат расширения.${long_fname:0:250}.${i##*.}
: Создает новое имя файла с допустимым количеством символов, а также добавляет.
реальное расширение файла.Просто мы зацикливаемся на списке файлов и извлекаем каждое из них с новым допустимым именем файла, которое состоит из 256 символов.
Переименовать
Вы можете использовать
zipnote
команду, это тоже частьzip
пакета.Сначала получите резервную копию вашего zip-файла.
Запустите эту команду:
Откройте имена с помощью редактора, это выглядит так:
Добавьте новые имена файлов, как это:
Затем для переименования файлов используйте:
Вы переименовали их все, вы также можете написать простой скрипт, который сделает это автоматически для вас.
источник
IFS= read -r i
если имена файлов начинаются с пробела или содержат вещи, которые оболочка может интерпретировать как escape-последовательности.