Teerextraktion hängt vom Dateinamen ab?

33

Ich lade oft Tarballs mit wget von sourceforge.net herunter.

Die heruntergeladenen Dateien werden dann benannt, z SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Wenn ich es versuche

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

Ich erhalte folgende Fehlermeldung:

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Nach dem Umbenennen der Datei foo.tar.gzfunktioniert die Extraktion einwandfrei.

Gibt es eine Möglichkeit, dass ich nicht jedes Mal gezwungen bin, die Zieldatei umzubenennen, bevor ich sie extrahiere?

Kasper
quelle

Antworten:

50

Der Grund für den Fehler, den Sie sehen, ist in der GNU-Teer-Dokumentation zu finden :

Wenn der Archivdateiname einen Doppelpunkt (':') enthält, wird davon ausgegangen, dass es sich um eine Datei auf einem anderen Computer handelt [...]

Das heißt, es ist interpretierend SQliteManager-1.2.4.tar.gz?r=http als Hostname und versucht, ihn in eine IP-Adresse aufzulösen, daher der Fehler "Auflösung fehlgeschlagen".

Dieselbe Dokumentation sagt weiter:

Wenn Sie eine Datei verwenden müssen, deren Name einen Doppelpunkt enthält, kann das Verhalten des Remote-Bandlaufwerks mithilfe der Option "--force-local" gesperrt werden.

camh
quelle
Beachten Sie, dass --force-localdies vor dem f... hinzugefügt werden muss. Als ich dies zum ersten Mal versuchte, gab es eine Fehlermeldung darüber, dass es keine solche Datei wie gibt --force-local. Vielleicht ist das zu "no duh", aber ich habe den Fehler, den ich gemacht habe, erst 5 Minuten später erkannt.
ArtOfWarfare
@ArtOfWarfare: Nimmt fein Argument, das die Tarfile ist. Sie können nicht --force-localzwischen das fund sein Argument setzen, aber das ist Standard für alle Programme, nicht nur tarund nicht nur -f. Sie können setzen --force-localnach f, solange es ist auch nach dem Argument zu f.
8.
Wie ich in meinem Kommentar sagte, ist es vielleicht zu "no duh". Ich benutze Teer wie diesen tar -cvzf ...und denke nicht einmal darüber nach, was jede Flagge wirklich 99% der Zeit macht - es ist nur reflexartig, dass ich so einen tar.gz mache.
ArtOfWarfare
In diesem Sinne, um hilfreicher zu sein, was diese beiden (@ArtOfWarfare und @camh) hier sagen, ist ein Beispiel: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr. Dan
6

Wenn Sie mit herunterladen wget, geben Sie den Namen der Ausgabedatei mit der -OOption an.

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

Dies bewirkt, dass die Datei unter dem angegebenen Dateinamen gespeichert wird, und erspart Ihnen die Mühe, sie umzubenennen. Und nein, Sie sind nicht der Einzige, der wünscht, Sourcefourge wäre nicht so dumm, Dateien mit den angehängten URL-Parametern zu verteilen.

Caleb
quelle
Das ist nicht SourceForges Schuld, aber es ist wget. Verwenden Sie das --content-dispositionFlag, um mit dem vom Server angegebenen Dateinamen zu speichern (achten Sie jedoch auf die Auswirkungen auf die Sicherheit, da SourceForge dann in einen beliebigen Dateinamen schreiben kann).
pcworld 20.11.18
4

Herunterladen mit

wget --trust-server-names URL

Auf diese Weise speichert wget mit den richtigen Dateinamen. Standardmäßig wird die letzte Komponente in der URL verwendet

Zum Beispiel

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download
Freidenker
quelle
4

Wie oben zitiert, macht die :(Spalte)tar eine Remote-Datei. Wir müssen also die Tatsache durchsetzen, dass es lokal ist.

Scheitern

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Lösung

Erklären Sie die Tatsache, dass es sich um eine lokale Datei handelt, indem Sie sie anhängen ./(aktuelles Verzeichnis) und korrekt zitieren:

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

Die Warnung ist darauf zurückzuführen, dass ich sie im Quellverzeichnis erstelle.

Édouard Lopez
quelle
Viel besser als mit einer langen Flagge. Ich glaube auch, dass das Herunterladen von Remote-Hosts nutzlos ist, obwohl es spezielle Tools gibt, um diesen Zweck zu erreichen.
Alireza Mohamadi
3

Für bereits heruntergeladene Dateien sollte dies funktionieren:

tar xzf - < SQliteManager-1.2.4.tar.gz*
jlliagre
quelle