Если я выполняю 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’
...
(Счастливый использовать завихрение или подобную scriptable альтернативу, если wget не может сделать этого.)
Я предлагаю, чтобы Вы использовали -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
, вероятно, более оптимальный вариант.
Также существует другая опция, названная -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
опция, потому что эти опции будут перезапись файл загрузки с Вашим локальным файлом, если у них были те же имена.
Протест (из комментария jofel)
-nc
опция не обновляет файл, если это изменилось на сервере. Если Вы знаете, что файл изменится, -N
, опция предпочтительна. Если Вы знаете, что файл не изменится (или Вы не заботитесь), тогда -nc
, в порядке.
Я знаю, что это было конкретным вопросом относительно wget, но OP действительно упоминал "Счастливый использовать завихрение или подобную scriptable альтернативу, если wget не может сделать этого". Я не уверен, что здесь требование (несколько файлов, сохраните старую версию, если отличающийся от исходного, замены недавно загруженной версией). В зависимости от того, что Вы хотите и как Вы хотите обработать дубликаты, Вам, возможно, понадобятся больше, чем это.. Очень простой способ сделать, что Вы, кажется, хотите, состоит в том, чтобы просто использовать завихрение вместо этого.
curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png
Эта команда заменит старый файл недавно загруженным каждый раз.
не производят это к терминалу (без"> [имя файла]"), если Вы загружаете двоичный файл в противоположность тексту. Выполнение так желание могло потенциально смешать с Вашим терминальным сеансом. В случае Вы действительно делаете это на несчастном случае, Вы, возможно, должны открыть другую оболочку/терминальный сеанс.
Да это -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.
Протесты (из комментариев jofel)
Если файл изменился на сервере, -c
опция может дать неправильные результаты.
С -c
, wget просто просит у сервера любые данные вне части уже загруженного файла, ничего иного. Это не проверяет, было ли какое-либо изменение в части файла, который уже загружается. Таким образом Вы могли поврежденный файл, который является смесью старого и нового файла.
Локальный тест
Можно протестировать его путем выполнения простого локального веб-сервера как после (Благодаря ответу @roadmr):
Откройте Окна терминала и тип:
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 ...
. Большой, теперь Вы будете видеть перезагрузки файла снова, но Вы уже загрузили его прежде.
потому что его размер, измененный на больший размер, чем старый загруженный файл и ничто иное.