Posso parar de criar duplicatas?

13

Se eu executar o wget duas vezes, ele não reconhece que já fez o download desse arquivo e cria um novo. Existe alguma maneira de impedir o download do arquivo novamente?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

(É bom usar curl ou uma alternativa semelhante a script, se o wget não puder fazer isso.)

david.libremone
fonte
9
Bem, ele cria um novo porque reconhece que o arquivo está lá!
Nico

Respostas:

17

Eu sugiro que você use a -Nopção

-N
--timestamping
    Turn on time-stamping.

Ele permite o registro de data e hora, que baixa novamente o arquivo se for mais novo no servidor que a versão baixada.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

Ressalva (de comentário de KasiyA)

Se o servidor não estiver configurado corretamente, ele poderá sempre relatar que o arquivo é novo e -Nsempre fará o download novamente do arquivo. Nesse caso, -ncé provavelmente uma opção melhor.

jofel
fonte
3
Quando um servidor não está configurado corretamente, -Npode falhar e o wget sempre baixa novamente. Então, às vezes -ncé melhor que-N
αғsнιη
1
@ Kasiy obrigado pelo seu comentário, parece não haver boa opção para todos os casos.
Jofel
16

Sim, é -copção.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

Se o arquivo for o mesmo, a segunda tentativa de download será interrompida.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

Advertências (dos comentários de jofel)

Se o arquivo foi alterado no servidor, a -copção pode fornecer resultados incorretos.

Com -c, o wget simplesmente pede ao servidor quaisquer dados além da parte do arquivo já baixado, nada mais. Ele não verifica se houve alguma alteração na parte do arquivo que já foi baixada. Assim, você pode ter um arquivo corrompido, que é uma mistura do arquivo antigo e do novo.


Teste local

Você pode testá-lo executando web-servidor local simples como seguir (graças a @roadmr 's resposta ):

Abra as janelas de um terminal e digite:

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

Agora abra outro terminal e faça:

wget -c http://localhost:8000/filename-to-download

Observe que filename-to-downloadé o arquivo localizado no /path/to/parent-download-dir/qual queremos fazer o download.

Agora, se você executar o comando wget por várias vezes, verá:

The file is already fully retrieved; nothing to do.

Ok, agora vá para o /path/to/parent-download-dir/diretório e adicione algo ao arquivo de origem, por exemplo, se for um arquivo de texto, adicione uma linha extra simples e salve o arquivo. Agora tente com wget -c .... Ótimo, agora você verá o download novamente do arquivo, mas já o baixou antes.

Razão: por que fazer novamente o download?

porque seu tamanho mudou para um tamanho maior que o arquivo baixado antigo e nada mais.

αғsнιη
fonte
1
Isso não funcionará corretamente se o arquivo foi alterado no servidor entre os downloads. Na pior das hipóteses (o tamanho do arquivo aumentou), você obtém um arquivo corrompido.
jofel
1
@ jofel sim -ncnão como você disse, mas a -copção funcionará e é por isso que mencionei a -copção primeiro.
αғsнιη
Com -c, wgetsolicita ao servidor quaisquer dados além da parte do arquivo já baixado, nada mais. Ele não verifica se há alguma alteração na parte já baixada do arquivo no servidor. Na pior das hipóteses, você obtém um arquivo corrompido, que é uma mistura entre o arquivo antigo e o novo.
Jofel
depois de revisar as opções, acho que isso só é útil para algo como um arquivo de log (atualizações incrementais garantidas); em todos os outros casos, acho que -N ou -nc são mais apropriados, pois lidam com arquivos inteiros
david.libremone
3

Também há outra opção chamada -ncwgetting:

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

Quando a -ncopção é especificada, o Wget se recusará a baixar cópias do mesmo arquivo. Se você tiver o mesmo arquivo que wgettenta fazer o download, ele se recusará a fazer o download, a menos que você renomeie ou remova o arquivo local.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

Às vezes, essa opção é muito boa e eu recomendo usar-nc opção em vez de ambas -cou a -Nopção, porque essas opções substituirão o arquivo de download pelo arquivo local se eles tiverem o mesmo nome.

Advertência (do comentário de jofel)

A -ncopção não atualiza o arquivo se ele tiver sido alterado no servidor. Se você souber que o arquivo será alterado, a -Nopção é preferível. Se você sabe que o arquivo não será alterado (ou não se importa), -nctudo bem.

αғsнιη
fonte
1

Eu sei que essa era uma pergunta específica sobre o wget, mas o OP mencionou "Feliz em usar curl ou uma alternativa semelhante a script, se o wget não puder fazer isso". Não sei qual é o requisito aqui (vários arquivos, mantenha a versão antiga, se diferente da original, substitua pela versão recém-baixada). Dependendo do que você deseja e de como deseja manipular as duplicatas, pode ser necessário mais do que isso. Uma maneira muito simples de fazer o que você deseja é simplesmente usar o curl.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

Este comando substituirá o arquivo antigo pelo novo, baixado todas as vezes.

Não envie isso para o terminal (sem o "> [nome do arquivo]") se estiver baixando um arquivo binário em vez de texto. Fazer isso poderá interferir com a sua sessão do terminal. No caso de você fazer isso por acidente, pode ser necessário abrir outra sessão do shell / terminal.

Goblinlord
fonte
Se o seu terminal estiver em mau estado porque você exibiu arquivos binários, talvez seja mais fácil chamar o programa de "redefinição" do que abrir um novo terminal.
Jofel
você está certo de que eu não estava claro em minhas necessidades, o resultado feliz é que eu aprendi sobre mais algumas opções :) Obrigado
david.libremone
Obrigado @jofel ^^ não sabia sobre "redefinir" Eu sempre fechei, abriu uma nova aba e fechei a truncada quando isso aconteceu ... embora eu realmente não tenha acontecido com frequência.
Goblinlord 21/01