Встречался ли Вам когда-нибудь 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}'
Конвейер учитывает наличие папок в архиве и пробелов в именах.