Как загрузить архив и извлечь его, не сохраняя архив на диск?

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

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 цель, но на практике я не знаю, как скомпоновать фрагменты.

2 Solutions collect form web for “Как загрузить архив и извлечь его, не сохраняя архив на диск?”

Вы можете сделать это, указав wget для вывода своей полезной нагрузки в stdout (с флагом -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 

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

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

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

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

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

Interesting Posts
Linux и Unix - лучшая ОС в мире.