Bash - как распаковать zip-файл по каналу (из "wget ​​-qO-") - PullRequest
21 голосов
/ 20 августа 2011

Любые идеи о том, как распаковать zip-файл по трубопроводу, например:

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip

Я хотел распаковать файл в каталог, как мы обычно делали с обычным файлом:

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | unzip -d ~/Desktop

Ответы [ 6 ]

29 голосов
/ 16 апреля 2014

Формат файла ZIP включает в себя каталог (индекс) в конце архива.В этом каталоге указано, где в архиве находится каждый файл, и, таким образом, обеспечивается быстрый произвольный доступ без чтения всего архива.

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

Каталог в конце архива не является местоположением only , где метаинформация файлахранится в архиве.Кроме того, отдельные записи также включают эту информацию в локальный заголовок файла для целей резервирования.

Хотя не каждый распаковщик ZIP будет использовать локальные заголовки файлов, когда индекс недоступен, внешние интерфейсы tar и cpio для libarchive (он же bsdtar и bsdcpio) могут и будут делать это при чтениитруба, что означает следующее:

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | bsdtar -xvf- -C ~/Desktop
10 голосов
/ 22 августа 2011
wget -qO- -O tmp.zip http://downloads.wordpress.org/plugin/akismet.2.5.3.zip && unzip tmp.zip && rm tmp.zip
6 голосов
/ 15 ноября 2013

Хотя следующее не будет работать в bash, оно будет работать в zsh. Поскольку многие пользователи zsh могут оказаться здесь, это может быть полезно:

unzip =( wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip )
5 голосов
/ 14 сентября 2017

просто используйте zcat

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt
  • Это позволит извлечь только первый файл.После извлечения первого файла вы увидите это сообщение об ошибке «gzip: stdin содержит более одной записи - остальные игнорируются».
4 голосов
/ 20 августа 2011

Я бы посмотрел на funzip (http://www.info -zip.org / mans / funzip.html).Страница руководства для него отмечает,

...filter for extracting from a ZIP archive in a pipe

Извините, у меня нет примера, но похоже, что он поставляется с утилитой unzip для Linux.

3 голосов
/ 11 октября 2018

BusyBox unzip может взять стандартный вывод и извлечь все файлы.

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip -

Тире после unzip означает использование ввода в качестве ввода.

Вы можете даже,

cat file.zip | busybox unzip -

Но это просто избыточно unzip file.zip.

Если ваш дистрибутив по умолчанию использует BusyBox (например, Alpine), просто запустите unzip -.

...