O wget -o grava arquivos vazios em caso de falha


14

Se eu escrever o wget "sem esse endereço" -o "test.html", ele primeiro cria o test.html e, em caso de falha, deixa em branco. No entanto, quando não estiver usando -o, ele aguardará para ver se o download foi bem-sucedido e somente depois disso gravará o arquivo.

Gostaria que o último comportamento fosse aplicado a -o também, é possível?

Respostas:


17

wget retorna um status de saída diferente de zero quando a URL não é encontrada; portanto, você pode anexar um comando de remoção em caso de falha:

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

Ou crie um arquivo temporário e mova-o apenas para o sucesso desejado:

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

O segundo tem o benefício de não excluir um arquivo existente em caso de falha, mas certifique-se de usar nomes temporários exclusivos (consulte man tempfile) se você estiver executando várias instâncias em paralelo.


Além disso, adicionar --retry-connrefused pode ajudar a impedir o arquivo vazio em primeiro lugar.
akom

Se isso estiver acontecendo em um executivo em um manifesto de fantoche, a alteração cria o arquivo => para a menos que => "[-s file]" possa torná-lo auto-reparável.
akom

13

Conforme escrito nos comentários, wget -O é mais como um redirecionamento de shell que sempre grava no arquivo, independentemente de erros.

Você pode usar curl -f:

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

Ele não tocará no arquivo local se houver um erro ao buscar o arquivo.


4

A sintaxe correta é

wget "url" -O file

observe o UPPERCASE O. As opções -o informam ao wget para escrever um arquivo de log , é por isso que ele é sempre escrito mesmo em caso de falha.


No começo, pensei que estava funcionando, mas depois descobri que não estava. tente wget " host.does.not.exist " -O "emptyFile" Um erro é retornado, mas o emptyFile é criado.
akurtser

1
@akurtser você está certo. Eu acho que não há como dizer ao wget para não criar o arquivo. Encontrei este tópico: mail-archive.com/wget@sunsite.dk/msg08586.html no qual eles discutem o assunto. A linha de base é que você pode ter vários downloads para o mesmo arquivo, para que seja criado porque o wget não pode ter certeza de que TODOS os URLs falharão.
Sr. Shunz

Bem, obrigado, é parte de um script bash que estou escrevendo, então tentarei primeiro salvar um arquivo temporário que, em caso de download bem-sucedido, será renomeado. Não é muito elegante, mas não consegue pensar em nada melhor.
akurtser

1
@akurtser Certamente você pode verificar o código de retorno do wget então ... ele deve dizer se você pode excluir o arquivo "se não for encontrado". Portanto, não há necessidade de temp / renomear.
Sr. Shunz

1
A opção -O é um redirecionamento, que redireciona o conteúdo baixado para um arquivo, mesmo nos casos em que não há conteúdo. Portanto, um arquivo é sempre criado, mesmo se o download falhar.
Quan até

0

De acordo com o documento de ajuda (wget -h), você pode usar a opção --spider para pular o download (versão 1.14).

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.