Могу ли я остановить создание дубликатов wget?

13

Если я запускаю wget дважды, он не распознает, что он уже скачал этот файл, и создает новый. Есть ли способ предотвратить загрузку файла снова?

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

(Рад использовать curl или аналогичную альтернативу, если wget не может этого сделать.)

david.libremone
источник
9
Ну, он создает новый, потому что он распознает файл там!
Нико

Ответы:

17

Я предлагаю вам использовать -Nопцию.

-N
--timestamping
    Turn on time-stamping.

Он включает отметку времени, при которой файл повторно загружается только в том случае, если на сервере он новее, чем загруженная версия.

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

Предостережение (из комментария KasiyA)

Если сервер не настроен должным образом, он всегда может сообщить, что файл новый, и -Nвсегда будет перезагружать файл. В этом случае, -ncвероятно, лучший вариант.

jofel
источник
3
Если сервер не настроен должным образом, -Nможет произойти сбой, и wget всегда будет загружен заново. Так что иногда -ncлучше, чем-N
αғsнιη
1
@Kasiy, спасибо за ваш комментарий, похоже, нет подходящего варианта для всех случаев.
Джофель
16

Да, это -cвариант.

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

Если файл такой же, вторая попытка загрузки остановится.

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

Предостережения (из комментариев Джофеля)

Если файл изменился на сервере, -cопция может дать неверные результаты.

С помощью -cwget просто запрашивает у сервера любые данные, кроме части уже загруженного файла, и ничего больше. Он не проверяет, было ли какое-либо изменение в части файла, который уже загружен. Таким образом, вы можете испортить файл, который представляет собой смесь старого и нового файла.


Локальный тест

Вы можете проверить это, запустив простой локальный веб-сервер следующим образом (благодаря @roadmr «S ответа ):

Откройте окно терминала и введите:

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

Теперь откройте другой терминал и выполните:

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

Обратите внимание, что filename-to-downloadэто файл, в /path/to/parent-download-dir/котором мы хотим его скачать.

Теперь, если вы запустите команду wget несколько раз, вы увидите:

The file is already fully retrieved; nothing to do.

Хорошо, теперь перейдите в /path/to/parent-download-dir/каталог и добавьте что-нибудь в исходный файл, например, если это текстовый файл, добавьте в него простую дополнительную строку и сохраните файл. Теперь попробуйте с wget -c .... Отлично, теперь вы увидите, что файл снова загружается, но вы уже скачали его раньше.

Причина: зачем перезагружать?

потому что его размер изменился на больший размер, чем старый загруженный файл и ничего больше.

αғsнιη
источник
1
Это не работает правильно, если файл изменился на сервере между загрузками. В худшем случае (размер файла увеличился) вы получите поврежденный файл.
Джофель
1
@jofel да -ncне так, как вы сказали, но -cопция будет работать, и поэтому я -cсначала упомянул опцию.
αғsнιη 13.01.15
С -c, wgetзапрашивает у сервера каких - либо данных за пределами части уже загруженного файла, больше ничего. Он не проверяет, есть ли какие-либо изменения в уже загруженной части файла на сервере. В худшем случае вы получите поврежденный файл, который представляет собой смесь старого и нового файла.
Джофель
после просмотра опций я думаю, что это полезно только для чего-то вроде файла журнала (гарантированные инкрементные обновления), во всех других случаях я думаю, что -N или -nc более уместны, поскольку они имеют дело с целыми файлами
david.libremone
3

Также есть еще одна опция -ncдля wgetting:

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

Когда -ncопция указана, Wget откажется загружать копии того же файла. Если у вас был тот же файл, который wgetпытается загрузить, он откажется загружать его, если вы не переименуете или не удалите локальный файл.

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

Иногда этот параметр очень хорош, и я рекомендовал использовать -ncпараметр вместо обоих -cили -Nпараметр, потому что эти параметры будут перезаписывать файл загрузки с вашим локальным файлом, если они имеют одинаковые имена.

Предостережение (из комментария Джофеля)

-ncПараметр не обновляет файл , если он изменился на сервере. Если вы знаете, что файл изменится, -Nопция предпочтительнее. Если вы знаете, что файл не изменится (или вам все равно), тогда -ncвсе в порядке.

αғsнιη
источник
1

Я знаю, что это был конкретный вопрос, касающийся wget, но OP упомянул: «Я рад использовать curl или подобную альтернативу с возможностью написания сценариев, если wget не может этого сделать». Я не уверен, что требование здесь (несколько файлов, сохранить старую версию, если отличается от оригинала, заменить на вновь загруженную версию). В зависимости от того, что вы хотите и как вы хотите обрабатывать дубликаты, вам может понадобиться нечто большее. Очень простой способ сделать то, что вам кажется, - просто использовать вместо этого curl.

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

Эта команда заменит старый файл на вновь загруженный каждый раз.

Не выводите это на терминал (без «> [имя файла]»), если вы загружаете двоичный файл, а не текст. Это может потенциально помешать вашему терминальному сеансу. В случае, если вы делаете это случайно, вам может потребоваться открыть другой сеанс оболочки / терминала.

Goblinlord
источник
Если ваш терминал находится в плохом состоянии из-за отображения двоичных файлов, возможно, проще вызвать программу «сброс», чем открывать новый терминал.
Джофель
вы правы в том, что я не совсем понял свои требования, счастливый результат в том, что я узнал еще о нескольких вариантах :) спасибо
david.libremone
Спасибо, @jofel ^^ не знал о «перезагрузке», я всегда просто закрывал, открывал новую вкладку и закрывал искаженную, когда это произошло ... хотя у меня не было так часто.
Гоблинлорд