Wie lade ich ein Archiv herunter und extrahiere es, ohne das Archiv auf der Festplatte zu speichern?

62

Ich möchte ein Archiv unter einem bestimmten Verzeichnis herunterladen und extrahieren. So habe ich es bisher gemacht:

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

Ich möchte stattdessen das Archiv im laufenden Betrieb herunterladen und extrahieren , ohne es tar.gzauf die Festplatte geschrieben zu haben. Ich denke, dass dies möglich ist, indem man die Ausgabe von wgetan tarweiterleitet und tarein Ziel angibt, aber in der Praxis weiß ich nicht, wie ich die Teile zusammensetzen soll.

Benjamin
quelle

Antworten:

95

Sie können dies tun, indem Sie angeben, dass die wgetNutzdaten an stdout (mit Flag -O-) ausgegeben werden sollen und die eigene Ausgabe (mit Flag -q) unterdrückt werden soll :

wget -qO- your_link_here | tar xvz -

So legen Sie ein Zielverzeichnis fest:

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

Aktualisieren

Wenn Sie zufällig GNU haben tar

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

sollten Sie alles in einem Schritt tun können.

-q ruhig

-O - Ausgabe auf Standardausgabe

Joseph R.
quelle
Zum angegebenen Pfad sollte sein:wget -qO- your_link_here | tar xvz - -C /target/directory
Marslo
Vielleicht einfach den Leuten sagen, dass sie stattdessen Teer verwenden sollen?
Alexander Mills
wget -qO- <url> | tar -xvz -C <target folder>arbeitete an Gnu Teer.
AlikElzin-kilaka
14

Eine andere Option ist, curldie standardmäßig in stdout schreibt:

curl -s some_url | tar xvz -C /tmp
Zlemini
quelle
2
Ich mag Ihre Option mehr als andere, abercurl -s some_url | tar xvz - -C /tmp
FiftiN
1
wie FiftiN vorschlug -> um beispielsweise eine gefilterte Liste von Dateien im Repository $ curl -L https://api.github.com/repos/repo_owner/repo_name/tarball | tar tvfz - -C /tmp --wildcards *.py
anzuzeigen,
11

Dieser Oneliner macht den Trick:

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

kurze erklärung: die rechte seite in der klammer wird zuerst ausgeführt ( -qsagt wget, dass es leise zu tun ist, -O -wird verwendet, um die ausgabe nach stdout zu schreiben).

Anschließend erstellen wir eine Named Pipe mit dem Prozessersetzungsoperator von Bash <(, um eine Named Pipe zu erstellen . Auf diese Weise erstellen wir einen temporären Dateideskriptor und leiten den Inhalt dieses Deskriptors mithilfe des <Dateiumleitungsoperators an tar weiter .

Da ich bin
quelle