Если я запускаю 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 не может этого сделать.)
Ответы:
Я предлагаю вам использовать
-N
опцию.Он включает отметку времени, при которой файл повторно загружается только в том случае, если на сервере он новее, чем загруженная версия.
Предостережение (из комментария KasiyA)
Если сервер не настроен должным образом, он всегда может сообщить, что файл новый, и
-N
всегда будет перезагружать файл. В этом случае,-nc
вероятно, лучший вариант.источник
-N
может произойти сбой, и wget всегда будет загружен заново. Так что иногда-nc
лучше, чем-N
Да, это
-c
вариант.Если файл такой же, вторая попытка загрузки остановится.
Предостережения (из комментариев Джофеля)
Если файл изменился на сервере,
-c
опция может дать неверные результаты.С помощью
-c
wget просто запрашивает у сервера любые данные, кроме части уже загруженного файла, и ничего больше. Он не проверяет, было ли какое-либо изменение в части файла, который уже загружен. Таким образом, вы можете испортить файл, который представляет собой смесь старого и нового файла.Локальный тест
Вы можете проверить это, запустив простой локальный веб-сервер следующим образом (благодаря @roadmr «S ответа ):
Откройте окно терминала и введите:
Теперь откройте другой терминал и выполните:
Обратите внимание, что
filename-to-download
это файл, в/path/to/parent-download-dir/
котором мы хотим его скачать.Теперь, если вы запустите команду wget несколько раз, вы увидите:
Хорошо, теперь перейдите в
/path/to/parent-download-dir/
каталог и добавьте что-нибудь в исходный файл, например, если это текстовый файл, добавьте в него простую дополнительную строку и сохраните файл. Теперь попробуйте сwget -c ...
. Отлично, теперь вы увидите, что файл снова загружается, но вы уже скачали его раньше.Причина: зачем перезагружать?
потому что его размер изменился на больший размер, чем старый загруженный файл и ничего больше.
источник
-nc
не так, как вы сказали, но-c
опция будет работать, и поэтому я-c
сначала упомянул опцию.-c
,wget
запрашивает у сервера каких - либо данных за пределами части уже загруженного файла, больше ничего. Он не проверяет, есть ли какие-либо изменения в уже загруженной части файла на сервере. В худшем случае вы получите поврежденный файл, который представляет собой смесь старого и нового файла.Также есть еще одна опция
-nc
для wgetting:Когда
-nc
опция указана, Wget откажется загружать копии того же файла. Если у вас был тот же файл, которыйwget
пытается загрузить, он откажется загружать его, если вы не переименуете или не удалите локальный файл.Иногда этот параметр очень хорош, и я рекомендовал использовать
-nc
параметр вместо обоих-c
или-N
параметр, потому что эти параметры будут перезаписывать файл загрузки с вашим локальным файлом, если они имеют одинаковые имена.Предостережение (из комментария Джофеля)
-nc
Параметр не обновляет файл , если он изменился на сервере. Если вы знаете, что файл изменится,-N
опция предпочтительнее. Если вы знаете, что файл не изменится (или вам все равно), тогда-nc
все в порядке.источник
Я знаю, что это был конкретный вопрос, касающийся wget, но OP упомянул: «Я рад использовать curl или подобную альтернативу с возможностью написания сценариев, если wget не может этого сделать». Я не уверен, что требование здесь (несколько файлов, сохранить старую версию, если отличается от оригинала, заменить на вновь загруженную версию). В зависимости от того, что вы хотите и как вы хотите обрабатывать дубликаты, вам может понадобиться нечто большее. Очень простой способ сделать то, что вам кажется, - просто использовать вместо этого curl.
Эта команда заменит старый файл на вновь загруженный каждый раз.
Не выводите это на терминал (без «> [имя файла]»), если вы загружаете двоичный файл, а не текст. Это может потенциально помешать вашему терминальному сеансу. В случае, если вы делаете это случайно, вам может потребоваться открыть другой сеанс оболочки / терминала.
источник