Хотел, конечно, назвать как-нибудь типа «гадское поведение wget
» или «уничтожение файлов wget
‘ом», но остановился на этом. Добавлю ссылку в пост о кодах ошибок (копия) на этот пост.
Но на самом деле, это вроде маленькая и многим известная штука, но которой мало кто задумывается. Особенно, если использует wget
в своих скриптах. Отдельно отметить это меня сподвиг тот самый скрипт, с которого я начал сегодняшний разговор о wget
(копия)
Оказывается, wget
создает новый файл перед закачкой. Несмотря на то, появятся там какие-то ошибки или нет, и несмотря на то, какие ошибки это будут, хоть это ошибки сервера (например 404, файл не найден), или ошибки сети (файл не удалось докачать), файл все равно будет создан. Хотя по логике, например, ошибку сервера (пусть 404) можно было бы сначала и проверить. Но wget
этого не делает, если не случилась ошибка с кодом 2
(ошибка параметров командной строки или конфигурационных файлов).
На самом деле, такой подход довольно правильный, ну и правда, какая разница, почему оно не скачалось (или не сохранилось на диск в случае I/O error
). И для анализа ошибок проблем меньше.
Наибольшую проблему это представляет собой тогда, когда пользователь указывает в параметрах wget
ключ -O <путь к файлу>
, тогда wget
придется его полюбому перезаписать.
Так-то у wget
есть «защита от дурака», если файл, например, file
уже существует, то при следующей закачке файл file
(под тем же именем) будет сохранен, как file.1
, и если что, старый файл останется в целости и сохранности. Но в скриптах ключ -O
удобно использовать. Не надо следить за этими номерами файлов, и вообще в скрипте, wget
без ключей, один сплошной геморрой. Так что ключи используют. Но как же правильно это сделать? Да выбирать место сохранения скачанного и проверять коды ошибок wget
!
1. Скачиваем файл во временный:
wget -O "/tmp/test.tmp" "http://example.org/test.dat"
2. Проверяем коды ошибок (здесь самый простой вариант)
if [ "$?" -eq 0 ]; then #Пункт 3 fi
3. Копируем скачанный файл в целевой: cp /tmp/test.tmp /home/pi/test.dat
Естественно, все имена файлов и пути меняем на свои.
1. Скачиваем файл:
wget -O "~.data/test.dat" "http://example.org/test.dat"
2. Проверяем коды ошибок (здесь самый простой вариант). Если ошибка — завершаем работу:
if [ "$?" -ne 0 ]; then rm "~.data/test.dat" echo "Data download error!" exit fi