Чи можу я припинити 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 не може цього зробити.)


9
Добре, це створює новий, оскільки він ВІДПОВІДАЄ файл там!
nico

Відповіді:


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.

Caveat (з коментаря KasiyA)

Якщо сервер не налаштований належним чином, він завжди може повідомити про те, що файл новий, і -Nвін завжди буде повторно завантажений. У цьому випадку, -ncмабуть, кращий варіант.


3
Якщо сервер не налаштований належним чином, -Nможе вийти з ладу і wget завжди буде перезавантажений. Тому іноді -ncкраще, ніж-N
αғsnιη

1
@Kasiy дякую за ваш коментар, здається, що для всіх випадків не існує хорошого варіанту.
jofel

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.

Caveats (з коментарів jofel)

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

З -c, wget просто запитує у сервера будь-які дані, що виходять за межі частини вже завантаженого файлу, нічого іншого. Він не перевіряє, чи не було змін у вже завантаженій частині файлу. Таким чином, ви могли пошкодити файл, який є сумішшю старого та нового файлу.


Місцевий тест

Ви можете перевірити це, запустивши простий локальний веб-сервер наступним чином (завдяки @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 .... Чудово, зараз ви знову побачите файл, але його вже завантажили.

Причина: чому повторна завантаження?

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


1
Це не працює правильно, якщо файл змінився на сервері між завантаженнями. У гіршому випадку (розмір файлу збільшився), ви отримуєте пошкоджений файл.
jofel

1
@jofel так -ncне так , як ви сказали, але -cваріант буде працювати, і тому я -cспочатку згадав варіант.
αғsnιη

З -c, wgetзапитує сервер для будь-яких даних, що виходять за межі частини вже завантаженого файлу, нічого іншого. Він не перевіряє, чи є тим часом якісь зміни вже завантаженої частини файлу на сервері. У гіршому випадку ви отримаєте пошкоджений файл, який є сумішшю старого та нового файлу.
jofel

Переглянувши параметри, я думаю, що це корисно лише для чогось типу файлу журналу (гарантовані додаткові оновлення), у всіх інших випадках я думаю, що -N або -nc є більш підходящими, оскільки вони мають справу з цілими файлами
david.libremone

3

Також є інший варіант, який називається -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.

Коли -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варіант, оскільки ці параметри замінять файл завантаження з вашим локальним файлом, якщо вони мають однакові імена.

Caveat (з коментаря jofel)

-ncПараметр не оновлює файл , якщо він змінився на сервері. Якщо ви знаєте, що файл зміниться, -Nваріант є кращим. Якщо ви знаєте, що файл не зміниться (або вам все одно), -ncце нормально.


1

Я знаю, що це було специфічним питанням щодо wget, але в ОП згадувалося "Рада використовувати curl або подібну альтернативу сценарію, якщо Wget не може цього зробити". Я не впевнений, яка тут вимога (декілька файлів, зберігати стару версію, якщо вона відрізняється від оригінальної, замінити на щойно завантажену версію). Залежно від того, що ви хочете, і як ви хочете обробляти дублікати, вам може знадобитися більше, ніж це. Дуже простий спосіб зробити те, що, здається, ви хочете, - просто використовувати curl.

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

Ця команда буде замінювати старий файл щойно завантаженим.

Не виводьте це до терміналу (без "> [ім'я файлу]"), якщо ви завантажуєте двійковий файл на відміну від тексту. Це може потенційно зіпсувати ваш термінальний сеанс. У випадку, якщо ви це зробите випадково, вам може знадобитися відкрити ще один сеанс оболонки / терміналу.


Якщо ваш термінал у поганій формі, оскільки ви відображали двійкові файли, можливо, простіше викликати програму "скидання", ніж відкривати новий термінал.
jofel

ви праві, що я не зрозумів мої вимоги, щасливий результат - я дізнався про ще кілька варіантів :) дякую
david.libremone

Спасибі @jofel ^^ не знав про "скидання". Я завжди просто закривав, відкривав нову вкладку і закривав пошкоджену, коли це сталося ... хоча я насправді цього не часто бував.
Гоблінлорд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.