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 -
.