Как перенаправить вывод wget, как введено для разархивации?

Число соответствует тому, какой раздел руководства, от которого страница; 1 пользовательские команды, в то время как 8 материал системного администратора. Страница справочника для человека сама (man man) объясняет это и перечисляет стандартные:

MANUAL SECTIONS
    The standard sections of the manual include:

    1      User Commands
    2      System Calls
    3      C Library Functions
    4      Devices and Special Files
    5      File Formats and Conventions
    6      Games et. al.
    7      Miscellanea
    8      System Administration tools and Daemons

    Distributions customize the manual section to their specifics,
    which often include additional sections.

Существуют определенные условия, которые имеют различные страницы в различных разделах (например. printf поскольку команда появляется в разделе 1, как a stdlib функция появляется в разделе 3); в случаях как этот можно передать число раздела man перед названием страницы для выбора, какой Вы хотите, или использование man -a показать каждую страницу соответствия подряд:

$ man 1 printf
$ man 3 printf
$ man -a printf

Можно сказать то, что разделяет термин, присоединяется man -k (эквивалентный apropos команда). Это сделает соответствия подстроки также (например, это покажет sprintf если Вы работаете man -k printf), таким образом, необходимо использовать ^term ограничить его:

$ man -k '^printf'
printf               (1)  - format and print data
printf               (1p)  - write formatted output
printf               (3)  - formatted output conversion
printf               (3p)  - print formatted output
printf [builtins]    (1)  - bash built-in commands, see bash(1)
137
18.06.2018, 23:31
9 ответов

Необходимо загрузить файлы на временный файл, потому что (заключение в кавычки разархивировать страницы справочника):

Архивы, считанные из стандартного входа, еще не поддерживаются, кроме с funzip (и затем только первый член архива может быть извлечен).

Просто объедините команды:

wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip; unzip temp.zip; rm temp.zip

Но для создания этого более гибким, необходимо, вероятно, поместить его в сценарий, таким образом, Вы сохраняете некоторый ввод и чтобы удостовериться, что Вы случайно не перезаписываете что-то, что Вы могли использовать mktemp команда для создания безопасного имени файла для временного файла:

#!/bin/bash
TMPFILE=`mktemp`
PWD=`pwd`
wget "$1" -O $TMPFILE
unzip -d $PWD $TMPFILE
rm $TMPFILE
100
27.01.2020, 19:29
  • 1
    wget file.zip && unzip file.zip то же как wget file.zip; unzip file.zip или каждый предпочтен по другому? Спасибо :) –  jaggedsoft 03.12.2016, 22:10
  • 2
    @NextLocal wget && unzip будет работать разархивировали только если wget, за которым следуют. wget ; unzip будет работать разархивировали так или иначе, возможно указывающий не существующий файл. –  temoto 07.02.2017, 13:37

Я не думаю, что Вы даже хотите потрудиться передавать вывод wget по каналу в, разархивировали.

Из статьи "ZIP (file format)" Википедии:

Zip-файл определяется присутствием центрального каталога, расположенного в конце файла.

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

15
27.01.2020, 19:29

Если у вас установлен JDK, вы можете использовать jar :

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin
21
27.01.2020, 19:29

Это репост моего ответа на аналогичный вопрос:

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

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

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

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

wget -qO- http://example.org/file.zip | bsdtar -xvf-
78
27.01.2020, 19:29

Правильный синтаксис:

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip)

, но он не будет работать из-за ошибки ( Info-ZIP на Debian ):

lseek(3, 0, SEEK_SET)                   = -1 ESPIPE (Illegal seek)

Archive:  /dev/fd/63
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of /dev/fd/63 or
        /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period.

или в BSD / OS X:

Trying to read large file (> 2 GiB) without large file support

Это потому, что стандартные инструменты zip в основном используют lseek функцию для установки смещения файла в конце, чтобы прочитать его конец записи центрального каталога . Он находится в конце структуры архива и требуется для чтения списка файлов (см .: Структура формата Zip-файла ). Следовательно, файл не может быть FIFO, конвейером, оконечным устройством или любым другим динамическим, потому что входной объект не может быть позиционирован функцией lseek .

Итак, у вас есть следующие обходные пути:

  • используйте другой вид сжатия (например, tar.gz ),
  • вы должны использовать две отдельные команды,
  • используйте альтернативные инструменты (как предложено в других ответах),
  • создать псевдоним или функцию для использования нескольких команд.
10
27.01.2020, 19:29

Репост моего ответа:

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

21
27.01.2020, 19:29

У меня это хорошо работает:

tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834)

jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834)

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf -

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -
0
27.01.2020, 19:29

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

Альтернативное решение — посмотреть, можете ли вы получить другой формат файла, например .tar.gz.

Например, если вы загружаете файл .zipс GitHub, почти всегда доступна версия .tar.gz.

Например,

Обратите внимание на шаблон --просто замените .zipна .tar.gzи подключитесь к| tar xzf -

0
23.02.2020, 20:08

Если в zip только один файл, можно использовать zcatилиgunzip:

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip

К вашему сведению :Вот определения gunzipи zcatв моей системе:

$ grep ^exec $(which gunzip zcat)
/bin/gunzip:exec gzip -d "$@"
/bin/zcat:exec gzip -cd "$@"
0
12.03.2020, 00:13

Теги

Похожие вопросы