Gibt es eine Curl/Wget-Option, die besagt, dass Dateien bei HTTP-Fehlern nicht gespeichert werden sollen?

StackOverflow https://stackoverflow.com/questions/89989

  •  01-07-2019
  •  | 
  •  

Frage

Ich möchte viele URLs in einem Skript herunterladen, aber diejenigen nicht speichern, die zu HTTP-Fehlern führen.

Soweit ich den Manpages entnehmen kann, auch nicht curl oder wget eine solche Funktionalität bereitstellen.Kennt jemand einen anderen Downloader, der das kann?

War es hilfreich?

Lösung

Ein Liner ich gerade Setup für diesen Zweck:

(funktioniert nur mit einer einzigen Datei, könnte für andere nützlich sein)

A=$$; ( wget -q "http://foo.com/pipo.txt" -O $A.d && mv $A.d pipo.txt ) || (rm $A.d; echo "Removing temp file")

Dies wird versuchen, die Datei aus der Remote-Host zum Download bereit. Wenn ein Fehler auftritt, wird die Datei nicht gehalten. In allen anderen Fällen ist es gehalten und umbenannt.

Andere Tipps

Ich denke der -f Option zu curl macht was du willst:

-f, --fail

(HTTP) Schlägt bei Serverfehlern stillschweigend fehl (überhaupt keine Ausgabe).Dies geschieht hauptsächlich, um Skripte usw. besser zu aktivieren, um besser mit gescheiterten Versuchen umzugehen.In normalen Fällen, in denen ein HTTP -Server ein Dokument nicht liefert, gibt er ein HTML -Dokument zurück, in dem dies so angegeben ist (was häufig auch warum und mehr beschreibt).Dieses Flag verhindert, dass Curl dies ausgibt und Fehler 22 zurückgibt.[...]

Wenn es sich bei der Antwort jedoch tatsächlich um eine 301- oder 302-Weiterleitung handelte, wird diese trotzdem gespeichert, auch wenn das Ziel zu einem Fehler führen würde:

$ curl -fO http://google.com/aoeu
$ cat aoeu
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/aoeu">here</A>.
</BODY></HTML>

Um der Weiterleitung bis in die Sackgasse zu folgen, geben Sie auch das ein -L Möglichkeit:

-L, --location

(HTTP/HTTPS) Wenn der Server berichtet, dass die angeforderte Seite an einen anderen Ort verschoben ist (angezeigt mit einem Ort:Header und ein 3xx -Antwortcode), in dieser Option wird Curl die Anforderung an der neuen Stelle wiederholen.[...]

Alter Thread .. landete hier nach einer Lösung gesucht ... am Ende einig Shell-Code zu schreiben, es zu tun.

if [ `curl -s -w "%{http_code}" --compress -o /tmp/something \
      http://example.com/my/url/` = "200" ]; then 
  echo "yay"; cp /tmp/something /path/to/destination/filename
fi

Dies wird Ausgabe in eine tmp-Datei herunterladen, und erstellen / Ausgabedatei überschreiben nur, wenn Status war ein 200. Mein usecase etwas anders ist .. in meinem Fall der Ausgang> 10 Sekunden dauert ... zu erzeugen, und ich tat es nicht will die Zieldatei für die Dauer leer bleiben.

ich eine Abhilfe vorzuschlagen habe, tut es die Datei herunterladen, aber es entfernt es auch, wenn seine Größe 0 (was passiert, wenn ein 404 auftritt).

wget -O <filename> <url/to/file>
if [[ (du <filename> | cut -f 1) == 0 ]]; then
    rm <filename>;
fi;

Es funktioniert für zsh, aber Sie können es auch für andere Schalen anpassen.

Aber es spart es nur an erster Stelle, wenn Sie die -O Option bieten

Hinweis: Ich bin mir bewusst, dass dies eine ältere Frage, aber ich glaube, ich habe eine bessere Lösung für diejenigen mit wget gefunden als eine der oben genannten Antworten geben

.
wget -q $URL 2>/dev/null

Wird die Zieldatei in dem lokalen Verzeichnis speichern, wenn und nur wenn der HTTP-Statuscode ist im 200-Bereich (Ok).

Außerdem, wenn Sie einen Fehler so etwas wie Ausdruck, wenn die Anforderung erfüllt wurde mit einem Fehler tun möchten, können Sie die wget Exit-Code für nicht-Null-Werte wie folgt:

wget -q $URL 2>/dev/null
if [ $? != 0]; then
    echo "There was an error!"
fi

Ich hoffe, das jemand hilfreich ist da draußen die gleichen Fragen, mit denen ich war.

Update: Ich dies nur in eine mehr Skript-able Form für mein eigenes Projekt, und dachte, ich würde teilen:

function dl {
    pushd . > /dev/null
    cd $(dirname $1)
    wget -q $BASE_URL/$1 2> /dev/null
    if [ $? != 0 ]; then
        echo ">> ERROR could not download file \"$1\"" 1>&2
        exit 1
    fi
    popd > /dev/null
}

Sie können die Datei herunterladen, ohne speichern mit "-O -" Option als

wget -O - http://jagor.srce.hr/

können Sie erhalten mor Informationen unter http: // www. gnu.org/software/wget/manual/wget.html#Advanced-Usage

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top