Как скачать архив и распаковать его без сохранения архива на диск?

62

Я хотел бы скачать и распаковать архив по заданному каталогу. Вот как я это делал до сих пор:

wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz
tar zxf dbt2-0.37.50.3.tar.gz
mv dbt2-0.37.50.3 dbt2

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

Вениамин
источник

Ответы:

95

Вы можете сделать это, указав wgetвыводить свою полезную нагрузку на стандартный вывод (с флагом -O-) и подавить собственный вывод (с флагом -q):

wget -qO- your_link_here | tar xvz -

Чтобы указать целевой каталог:

wget -qO- your_link_here | tar xvz - -C /target/directory

Обновить

Если у вас есть GNU tar

wget -qO- your_link_here | tar --transform 's/^dbt2-0.37.50.3/dbt2/' -xvz

должен позволить вам сделать все это за один шаг.

-q тихий

-O - вывод на стандартный вывод

Джозеф Р.
источник
К указанному пути следует:wget -qO- your_link_here | tar xvz - -C /target/directory
Марсло
может просто сказать людям использовать tar вместо wget тогда?
Александр Миллс
wget -qO- <url> | tar -xvz -C <target folder>работал на гну смолы.
Алик Эльзин-килака
14

Другой вариант - использовать curlзапись в stdout по умолчанию:

curl -s some_url | tar xvz -C /tmp
Zlemini
источник
2
Мне нравится ваш вариант больше, чем другим, ноcurl -s some_url | tar xvz - -C /tmp
ПЯТНИЦ
1
как предложил FiftiN -> например, для просмотра отфильтрованного списка файлов внутри хранилища можно использовать:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Алексей Глуховцев
11

Этот oneliner делает трюк:

tar xvzf -C /tmp/ < <(wget -q -O - http://foo.com/myfile.tar.gz)

краткое объяснение: правая часть в круглых скобках выполняется первой ( -qговорит wget сделать это тихо, -O -используется для записи вывода в stdout).

Затем мы создаем именованный канал, используя оператор подстановки процесса из Bash <(для создания именованного канала . Таким образом, мы создаем временный файловый дескриптор и затем направляем содержимое этого дескриптора в tar с помощью <оператора перенаправления файлов.

Это я
источник