wget -o записує порожні файли при відмові


13

Якщо я напишу wget "немає такої адреси" -o "test.html", він спочатку створює test.html, а в разі відмови залишає порожнім. Однак, якщо не використовується -o, він буде чекати, коли завантаження вдалося, і лише після цього він напише файл.

Я хотів би, щоб остання поведінка застосовувалася і до -o, чи це можливо?

Відповіді:


17

wget повертає ненульовий статус виходу, коли URL-адреса не знайдена, тож ви можете додати команду видалення при відмові:

wget "url" -O file || rm -f file

Або створіть тимчасовий файл і перемістіть його лише там, де ви бажаєте успіху:

wget "url" -O /tmp/wget && mv /tmp/wget file

Другий має перевагу не видаляти існуючий файл при відмові, але обов'язково використовуйте унікальні тимчасові імена (див. man tempfile), Якщо ви використовуєте кілька екземплярів паралельно.


Крім того, додавання --retry-connrefused може допомогти у запобіганні спочатку порожнього файлу.
аком

Якщо це відбувається в Exec в ляльковому маніфесті, зміна створює => файл для якщо => «[-s файл]» не може зробити його самовідновлення.
akom

10

Як написано в коментарях, wget -O більше схоже на перенаправлення оболонки, яке завжди записується у файл незалежно від помилок.

Ви можете використовувати curl -fнатомість:

curl -f http://nonexistent/file.jpg -o localfile.jpg

Він не торкнеться локального файлу, якщо виникла помилка при отриманні файлу.


4

Правильний синтаксис є

wget "url" -O file

зауважте ПОВЕРХНЕННЯ O. Параметри -o вказують wget написати файл журналу , тому він завжди пишеться навіть у випадку відмови.


Спочатку я думав, що це працює, але потім я виявив, що це не так. спробуйте wget " host.does.not.exist " -O "emptyFile" Помилка повертається, але порожній файл створений.
akurtser

1
@akurtser ти маєш рацію. Я думаю, немає способу сказати wget не створювати файл. Я знайшов цю тему: mail-archive.com/wget@sunsite.dk/msg08586.html, в якій вони обговорюють це питання. Основна лінія полягає в тому, що ви можете мати МНОГО завантажень у той самий файл, щоб він створювався, тому що wget не може бути впевнений, що ВСІ URL-адреси вийдуть з ладу.
Містер Шунц

Ну дякую, це частина баш сценарію, про який я пишу, тому я спробую спершу зберегти його тимчасовий файл, який у разі успішного завантаження буде перейменований. Не дуже елегантний, але нічого кращого не можна придумати.
akurtser

1
@akurtser Безумовно, ви можете перевірити код повернення з wget, то ... він повинен повідомити вам, чи можете ви видалити файл "якщо його не знайдено". Тому немає необхідності в темп / перейменуванні.
Містер Шунц

1
Опція -O - це перенаправлення, яке перенаправляє завантажений вміст у файл, навіть у випадках, коли вмісту немає. Тому файл завжди створюється, навіть якщо завантаження не вдалося.
Куан

0

Відповідно до довідкового документа (wget -h), ви можете скористатися опцією --spider, щоб пропустити завантаження (версія 1.14).

Download:
  -S,  --server-response         print server response.
       --spider                  don't download anything.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.