Existe uma opção curl/wget que diz para não salvar arquivos em caso de erros de http?

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Quero baixar muitos URLs em um script, mas não quero salvar aqueles que levam a erros de HTTP.

Pelo que posso dizer nas páginas de manual, nem curl ou wget fornecer tal funcionalidade.Alguém sabe de outro downloader que faça isso?

Foi útil?

Solução

Um forro Eu só configuração para este fim:

(funciona apenas com um único arquivo, pode ser útil para outros)

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

Esta tentará baixar o arquivo a partir do host remoto. Se houver um erro, o arquivo não é mantido. Em todos os outros casos, ele é mantido e renomeado.

Outras dicas

Eu acho que o -f opção para curl faz o que você quer:

-f, --fail

(HTTP) Falha silenciosamente (sem saída) em erros do servidor.Isso é feito principalmente para permitir melhor os scripts etc. para lidar melhor com tentativas fracassadas.Nos casos normais, quando um servidor HTTP não entrega um documento, ele retorna um documento HTML indicando assim (que geralmente também descreve o porquê e muito mais).Este sinalizador impedirá que o CURL emitirá isso e retorne o erro 22.[...]

No entanto, se a resposta for realmente um redirecionamento 301 ou 302, ela ainda será salva, mesmo que seu destino resulte em um erro:

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

Para seguir o redirecionamento até seu beco sem saída, forneça também o -L opção:

-L, --location

(HTTP/HTTPS) Se o servidor relatar que a página solicitada foi movida para um local diferente (indicado com um local:Cabeçalho e um código de resposta 3xx), esta opção fará com que o CLL refaça a solicitação no novo local.[...]

linha antiga .. desembarcou aqui procurando uma solução ... acabou escrevendo algum código shell para fazê-lo.

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

Isto irá baixar saída para um arquivo tmp, e criar / arquivo de saída de substituição somente se o status foi um 200. Minha usecase é ligeiramente diferente .. no meu caso a saída leva> 10 segundos para gerar ... e eu não fiz deseja que o arquivo de destino permaneça em branco para que a duração.

Eu tenho uma solução alternativa a propor, ele faz o download do arquivo, mas ele também remove-se o seu tamanho é 0 (que acontece se a 404 ocorre).

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

Ele funciona para zsh mas você pode adaptá-lo para outras conchas.

Mas ele só salva-lo em primeiro lugar, se você fornecer a opção -O

NOTA:. Estou ciente de que esta é uma questão mais velho, mas eu acredito que eu encontrei a melhor solução para aqueles que utilizam wget que qualquer uma das respostas acima fornecem

wget -q $URL 2>/dev/null

Será que salvar o arquivo de destino para o diretório local se e somente se o código de status HTTP está dentro da faixa de 200 (OK).

Além disso, se você queria fazer algo como imprimir um erro sempre que o pedido foi recebida com um erro, você pode verificar o wget código de saída para valores diferentes de zero assim:

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

Espero que este seja útil para alguém lá fora, enfrentando os mesmos problemas que eu era.

Update: Acabei de colocar isso em uma forma mais script do poder para o meu próprio projeto, e pensei que iria partilhar:

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
}

Você pode baixar o arquivo sem salvar usando a opção "-O -" como

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

Você pode obter mor informações em http: // www. gnu.org/software/wget/manual/wget.html#Advanced-Usage

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top