wget -o записывает пустые файлы при неудаче

14

Если я напишу wget «нет такого адреса» -o «test.html», он сначала создаст test.html, а в случае сбоя оставит его пустым. Однако, если не использовать -o, он будет ждать, если загрузка удастся, и только после этого он запишет файл.

Я бы хотел, чтобы последнее поведение также применялось к -о, возможно ли это?

akurtser
источник

Ответы:

17

wget возвращает ненулевой статус завершения, когда URL не найден, поэтому вы можете добавить команду удаления при ошибке:

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

Или создайте временный файл и перемещайте его только там, где вы хотите, в случае успеха:

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

Второе преимущество заключается в том, что при удалении не удаляется существующий файл, но обязательно используйте уникальные временные имена (см. man tempfile), Если вы запускаете несколько экземпляров параллельно.

Ян Маккиннон
источник
Кроме того, добавление --retry-connrefused может помочь в первую очередь предотвратить пустой файл.
akom
Если это происходит в exec в манифесте-марионетке, изменение create => file на Если => "[-s file]" может сделать его самовосстанавливающимся.
АКОМ
13

Как написано в комментариях, wget -O больше похоже на перенаправление оболочки которое всегда записывает в файл независимо от ошибок.

Вы можете использовать curl -fвместо:

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

Он не коснется локального файла, если при загрузке файла произошла ошибка.

cweiske
источник
4

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

wget "url" -O file

обратите внимание на верхний регистр O. Опции -o заставляют wget записывать файл журнала , поэтому он всегда записывается даже при сбое.

Мистер Шунц
источник
Сначала я думал, что это работает, но потом я обнаружил, что это не так. попробуйте wget " host.does.not.exist " -O "emptyFile" Ошибка возвращается, но пустой файл создан.
Аккурсер
1
@akurtser ты прав. Я думаю, что нет способа сказать wget не создавать файл. Я нашел эту ветку : mail-archive.com/wget@sunsite.dk/msg08586.html, в которой они обсуждают этот вопрос. Исходный принцип заключается в том, что вы можете иметь НЕСКОЛЬКО загрузок в один и тот же файл, чтобы он был создан, потому что wget не может быть уверен, что ВСЕ URL-адреса потерпят неудачу.
г-н Шунц
Что ж, спасибо, это часть сценария bash, который я пишу, поэтому я просто попытаюсь сначала сохранить его в временном файле, который в случае успешной загрузки будет переименован. Не очень элегантно, но не могу придумать ничего лучшего.
Аккурсер
1
@akurtser Конечно, вы можете проверить код возврата из wget, тогда ... он должен сказать вам, если вы можете удалить файл "если не найден". Так что нет необходимости во временном / переименовании.
г-н Шунц
1
Опция -O - это перенаправление, которое перенаправляет загруженный контент в файл, даже если его нет. Поэтому файл всегда создается, даже если загрузка не удалась.
Цюань до
0

Согласно справке doc (wget -h), вы можете использовать опцию --spider, чтобы пропустить загрузку (версия 1.14).

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

скалистая ци
источник