Заметки · 18.07.2025

Благородный кот в коробке

Встречался ли Вам когда-нибудь zip-архив, из которого нельзя выдернуть файл по причине слишком длинного имени файла? Мне — да.

Конечно, случай не частый, но я всё-таки решил поведать о том как справится с проблемой и извлечь файл с бесконечным именем из архива имея под рукой только Linux (я применял Lubuntu 16.04) и утилиту unzip.

Если по какой-то причине unzip не установлен в Вашей системе — установим его командой:

sudo apt install unzip -y

По старой привычке, я всегда пишу выводы архиваторов в файл:

sudo unzip archive.zip >> log.txt

Внезапно работа архиватора прервалась с ошибкой:

error:  cannot create Очень длинное имя файла, которое едва поместилось в три строки консоли.pdf
File name too long

Однако, если использовать команду без перенаправления вывода в файл log.txt, unzip отлично отрабатывает, просто игнорируя файл с именем, которое куда больше напоминает титул одного из персонажей сериала про драконов и отмороженных зомби.

Ладно. Посмотрим, что творится внутри архива:

sudo unzip -l archive.zip

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

Попробуем извлечь файл, отправив его в поток stdout и переименовав его на выходе:

sudo unzip -p -c archive.zip "*Очень длинное имя файла, которое едва поместилось в три строки консоли*" > Тотсамыйфайл.pdf

В качестве P.S.: с помощью вот такой команды можно посмотреть файлы архива, чьё имя превышает 350 символов:

sudo unzip -l archive.zip | tail -n +4 | awk '{$1=$2=$3=""; sub("^[ ]*", ""); if (length($0) > 350) print $0}'

Конвейер учитывает наличие папок в архиве и пробелов в именах.