2015-07-03 4 views
1

В настоящее время я использую скрипт bash для загрузки нескольких изображений с помощью wget.wget: удалить неполные файлы

К сожалению, сервер, который я загружаю, менее надежный, поэтому иногда, когда я загружаю файл, сервер отключается, и скрипт переходит к следующему файлу, оставляя предыдущий неполным.

Для того чтобы исправить это я пытался добавить вторую линию после того, как сценарий извлекает все незавершенные файлы с помощью:

wget -c myurl.com/image{1..3}.png 

Это похоже на работу, как Wget восходит и завершает загрузку файлов, но проблема возникает из-за этого: ImageMagick, который я использую для создания изображений в pdf, заявляет, что есть ошибки с заголовками изображений.

Моя мысль о том, что при удалении неполных файлов является:

wget myurl.com/image{1..3}.png 
wget -rmincompletefiles 
wget -N myurl.com/image{1..3}.png 
convert *.png mypdf.pdf 

Так что вопрос в том, что я могу использовать вместо -rmincompletefiles, что на самом деле существует, или есть лучше, я должен быть приближения к этому вопрос?

+0

Попробуйте 'wget -m URL' – Cyrus

+0

Я не думаю, что понимаю, как зеркальное отражение поможет мне выполнить то, что я пытаюсь сделать. – iTry

ответ

1

Я сделал удивительное открытие при попытке реализовать tvm's suggestion.

Получается, и это что-то я не понял, что при запуске wget -N wget фактически проверяет размеры файлов и проверяет, что они одинаковые. Если это не так, файлы удаляются, а затем снова загружаются.

Столь крутой отзыв, если у вас такая же проблема!

+1

' wget -N' проверяет метку времени на сервер.Временная метка - это ПОСЛЕДНЯЯ вещь, которую устанавливает wget после полного скачивания файла, что означает, что любой частично загруженный файл почти гарантированно имеет другую временную метку. Проблема в том, что 'wget -N' НЕ будет повторно загружать файл, потому что он почти наверняка увидит более раннюю метку времени на сервере и сделает вывод, что локальный файл более новый. Вы получите ошибку, которая выглядит так: 'File 'somefile.mp3' не изменен на сервере. Опускание download.' wget -N, возможно, сработало для вас, если сервер не вернул отметку времени, что происходит. –

1

Ну, я бы постарался загрузить файлы с wget (вы можете указать дополнительные параметры, такие как больше --timeout, чтобы дать серверу дополнительное время). wget предполагает определенные вещи о частичной загрузке и даже при правильном возобновлении, иногда они могут оказаться искалеченными (если вы не проверите их, например, суммы MD5 другими способами).

Поскольку вы используете convert и bash, скорее всего, еще один инструмент, доступный из пакета Imagemagick, а именно identify.

Хотя некоторые функции, безусловно, плохо документированы, у него есть одна удивительная функциональность - он может идентифицировать сломанные (или частично загруженные изображения).

➜ ~ identify b.jpg; echo $? 
identify.im6: Invalid JPEG file structure: ... 
1 

Он будет возвращать статус выхода 1, если вы вызываете его на несогласованном изображении. Вы можете удалить эти несогласованные изображения с помощью простого цикла, такие как:

for i in *.png; 
    do identify "$i" || rm -f "$i"; 
done 

Тогда я хотел бы попытаться загрузить еще раз файлы, которые разрываются.

+0

Проблема с этим решением заключается в том, что идентификация фактически принимает мои частично загруженные изображения. Я не уверен, почему, но он делает, а затем пытается передать их для преобразования, который возвращает 'convert: corrupt image 2.png @ error/png.c/ReadPNGImage/3958.' – iTry

Смежные вопросы