Existe uma opção curl/wget que diz para não salvar arquivos em caso de erros de http?
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?
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