Bash - как распаковать zip-файл (из "wget-qO-")

любые идеи о том, как распаковать 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 ответов


wget -qO- -O tmp.zip http://downloads.wordpress.org/plugin/akismet.2.5.3.zip && unzip tmp.zip && rm tmp.zip


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

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

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

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

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | bsdtar -xvf- -C ~/Desktop

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

unzip =( wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip )

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

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

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


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

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | zcat >> myfile.txt
  • это будет только извлечь первый файл. Вы увидите это сообщение об ошибке "gzip: stdin имеет более одной записи--rest игнорируется" после извлечения первого файла.

busybox и это unzip можно взять stdin и извлечь все файлы.

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

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

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

cat file.zip | busybox unzip -

но это просто излишним unzip file.zip.

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