wget -o schreibt leere Dateien bei einem Fehler

14

Wenn ich wget "no such address" -o "test.html" schreibe, wird zuerst die test.html erstellt und im Fehlerfall leer gelassen. Wenn Sie -o jedoch nicht verwenden, wird abgewartet, ob der Download erfolgreich war. Erst danach wird die Datei geschrieben.

Ich möchte, dass das letztere Verhalten auch auf -o angewendet wird. Ist das möglich?

Akurtser
quelle

Antworten:

17

wget Gibt einen Exit-Status ungleich Null zurück, wenn die URL nicht gefunden wird, sodass Sie bei einem Fehler einen Befehl zum Entfernen anhängen können:

wget "url" -O file || rm -f file

Oder erstellen Sie eine temporäre Datei und verschieben Sie sie nur dort, wo Sie es möchten:

wget "url" -O /tmp/wget && mv /tmp/wget file

Die zweite Option hat den Vorteil, dass eine vorhandene Datei bei einem Fehler nicht gelöscht wird. Verwenden Sie jedoch eindeutige temporäre Namen (siehe man tempfile), wenn Sie mehrere Instanzen gleichzeitig ausführen.

Ian Mackinnon
quelle
Außerdem kann das Hinzufügen von --retry-connrefused helfen, die leere Datei an erster Stelle zu verhindern.
Akom
Wenn dies in einem Exec in einem Puppet-Manifest geschieht , können Sie durch Ändern von create => file zu, es sei denn, => "[-s file]", die Datei selbstheilend machen.
Akom
13

Wie in den Kommentaren geschrieben, wget -O handelt es sich eher um eine Shell-Umleitung, die unabhängig von Fehlern immer in die Datei schreibt.

Sie können curl -fstattdessen verwenden:

curl -f http://nonexistent/file.jpg -o localfile.jpg

Die lokale Datei wird nicht berührt, wenn beim Abrufen der Datei ein Fehler auftritt.

Cweiske
quelle
4

Die korrekte Syntax lautet

wget "url" -O file

Beachten Sie das GROSSBUCHSTABEN O. Die Option -o weist wget an, eine Protokolldatei zu schreiben. Deshalb wird sie auch bei Fehlern immer geschrieben.

Herr Shunz
quelle
Zuerst dachte ich, es würde funktionieren, aber dann stellte ich fest, dass es nicht funktionierte. try wget " host.does.not.exist " -O "emptyFile" Es wird ein Fehler zurückgegeben, aber die leere Datei wird erstellt.
Akurtser
1
@akurtser du hast recht. Ich glaube, es gibt keine Möglichkeit, wget anzuweisen, die Datei nicht zu erstellen. Ich habe diesen Thread gefunden: mail-archive.com/[email protected]/msg08586.html, in dem die Angelegenheit besprochen wird . Die Basis ist, dass Sie MEHRERE Downloads in dieselbe Datei haben können, damit diese erstellt wird, da wget nicht sicher sein kann, dass ALLE URLs fehlschlagen.
Herr Shunz
Nun, danke, es ist ein Teil eines Bash-Skripts, das ich gerade schreibe. Deshalb versuche ich, zunächst eine temporäre Datei zu speichern, die im Falle eines erfolgreichen Downloads umbenannt wird. Nicht sehr elegant, aber ich kann mir nichts Besseres vorstellen.
Akurtser
1
@akurtser Sicher können Sie den Rückkehrcode von wget dann überprüfen ... es sollte Ihnen sagen, ob Sie die Datei "wenn nicht gefunden" löschen können. Also keine Notwendigkeit für temporäres Umbenennen.
Herr Shunz
1
Die Option -O ist eine Umleitung, mit der der heruntergeladene Inhalt in eine Datei umgeleitet wird, auch wenn kein Inhalt vorhanden ist. Daher wird immer eine Datei erstellt, auch wenn der Download fehlgeschlagen ist.
Quan bis
0

Laut Hilfedokument (wget -h) können Sie die Option --spider verwenden, um den Download zu überspringen (Version 1.14).

Download:
  -S,  --server-response         print server response.
       --spider                  don't download anything.

felsiges Qi
quelle