Jak pobrać archiwum i wyodrębnić je bez zapisywania archiwum na dysku?

62

Chciałbym pobrać i rozpakować archiwum w danym katalogu. Oto jak to robiłem do tej pory:

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

Chciałbym zamiast tego pobierać i rozpakowywać archiwum w locie , bez konieczności tar.gzzapisywania na dysku. Myślę, że jest to możliwe, przesyłając dane wyjściowe wgetdo tari podając tarcel, ale w praktyce nie wiem, jak połączyć te elementy.

Benzoes
źródło

Odpowiedzi:

95

Możesz to zrobić, każąc wgetprzekazać jego ładunek na standardowe wyjście (z flagą -O-) i wyłączyć własne wyjście (z flagą -q):

wget -qO- your_link_here | tar xvz -

Aby określić katalog docelowy:

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

Aktualizacja

Jeśli zdarzy ci się mieć GNU tar

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

powinien pozwolić ci to wszystko zrobić w jednym kroku.

-q cichy

-O - wyjście na standardowe wyjście

Joseph R.
źródło
Do podanej ścieżki powinno być:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo
może po prostu powiedz ludziom, żeby używali tar zamiast wget?
Alexander Mills
wget -qO- <url> | tar -xvz -C <target folder>pracował na tar smaku.
AlikElzin-kilaka
14

Inną opcją jest użycie curldomyślnego zapisu na standardowe wyjście:

curl -s some_url | tar xvz -C /tmp
Zlemini
źródło
2
Podoba mi się twoja opcja bardziej niż inne, alecurl -s some_url | tar xvz - -C /tmp
FiftiN
1
jak sugeruje FiftiN -> np. aby wyświetlić przefiltrowaną listę plików w repozytorium, można użyć:$ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
Alex Glukhovtsev
11

Ten oneliner rozwiązuje problem:

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

krótkie wyjaśnienie: prawa strona w nawiasie jest wykonywana jako pierwsza ( -qmówi wget, aby zrobiła to po cichu, -O -służy do zapisania wyjścia na standardowe wyjście).

Następnie tworzymy nazwany potok za pomocą operatora podstawienia procesu z Bash, <(aby utworzyć nazwany potok . W ten sposób tworzymy tymczasowy deskryptor pliku, a następnie kierujemy jego zawartość do tar za pomocą <operatora przekierowania pliku.

To ja
źródło