Esiste un'opzione curl/wget che dice di non salvare i file in caso di errori http?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Voglio scaricare molti URL in uno script ma non voglio salvare quelli che portano a errori HTTP.

Per quanto posso dire dalle pagine man, nessuno dei due curl O wget fornire tale funzionalità.Qualcuno conosce un altro downloader che lo fa?

È stato utile?

Soluzione

Una fodera che ho appena impostato proprio per questo scopo:

(funziona solo con un singolo file, potrebbe essere utile per altri)

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

Questo tenterà di scaricare il file dall'Host remoto.Se si verifica un errore, il file non viene conservato.In tutti gli altri casi, viene mantenuto e rinominato.

Altri suggerimenti

Penso che la -f opzione a curl fa quello che vuoi:

-f, --fail

(HTTP) Errore silenzioso (nessun output) in caso di errori del server.Questo viene fatto principalmente per consentire meglio agli script ecc. Per gestire meglio i tentativi falliti.Nei casi normali in cui un server HTTP non riesce a fornire un documento, restituisce un documento HTML affermando così (che spesso descrive anche perché e altro ancora).Questo flag impedirà a Curl di produrre questo e di restituire l'errore 22.[...]

Tuttavia, se la risposta fosse effettivamente un reindirizzamento 301 o 302, verrà comunque salvato, anche se la sua destinazione risulterebbe in un errore:

$ 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>

Per seguire il reindirizzamento fino al suo vicolo cieco, fornire anche il file -L opzione:

-L, --location

(HTTP/HTTPS) Se il server riporta che la pagina richiesta è stata spostata in una posizione diversa (indicata con una posizione:Intestazione e un codice di risposta 3xx), questa opzione farà rifare Curl la richiesta nel nuovo posto.[...]

Filo antico..sono atterrato qui alla ricerca di una soluzione...ho finito per scrivere del codice shell per farlo.

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

Ciò scaricherà l'output in un file tmp e creerà/sovrascriverà il file di output solo se lo stato era 200.Il mio caso d'uso è leggermente diverso...nel mio caso l'output impiega > 10 secondi per essere generato...e non volevo che il file di destinazione rimanesse vuoto per quella durata.

Ho una soluzione alternativa da proporre, scarica il file ma lo rimuove anche se la sua dimensione è 0 (cosa che accade se si verifica un 404).

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

Funziona per zsh ma puoi adattarlo ad altre shell.

Ma lo salva in primo luogo solo se fornisci il file -O opzione

NOTA: Sono consapevole che questa è una domanda più vecchia, ma credo di aver trovato una soluzione migliore per coloro che la utilizzano wget rispetto a quanto fornito da una qualsiasi delle risposte di cui sopra.

wget -q $URL 2>/dev/null

Salverà il file di destinazione nella directory locale se e solo se il codice di stato HTTP è compreso nell'intervallo 200 (Ok).

Inoltre, se desideri fare qualcosa come stampare un errore ogni volta che la richiesta viene soddisfatta con un errore, puoi controllare il file wget codice di uscita per valori diversi da zero in questo modo:

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

Spero che questo sia utile a qualcuno là fuori che affronta i miei stessi problemi.

Aggiornamento:L'ho semplicemente inserito in una forma più scriptabile per il mio progetto e ho pensato di condividere:

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
}

È possibile scaricare il file senza salvare utilizzando "-O -" opzione come

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

Puoi ottenere maggiori informazioni su http://www.gnu.org/software/wget/manual/wget.html#Advanced-Usage

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top