Существует ли метод командной строки, с помощью которого я могу проверить, является ли загруженный файл полным или поврежденным?


13

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

Ответы:


10

Наиболее распространенный способ проверки целостности загружаемых файлов - использование контрольных сумм MD5. Это предполагает, что сайт, который вы загружаете с фактически опубликованных контрольных сумм MD5 своих файлов. Вы можете проверить контрольную сумму MD5, создав собственную контрольную сумму загруженного файла и сравнив ее с опубликованной контрольной суммой. Если они идентичны, файл, который вы скачали, завершен и не подделан.

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

Для создания контрольной суммы MD5 файла запустите md5sum myFile. В случае с wget эта команда может оказаться полезной, особенно если загружаемый файл имеет большой размер:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM,

Это создаст контрольную сумму «myFile» при загрузке и сохранит ее в файл MD5SUM, возможно сэкономив вам некоторое время.

В случае обрыва соединения я думаю, что лучшим способом будет проверить коды выхода wget. Если загрузка прошла без ошибок, wget вернется 0. Все остальное указывает на то, что что-то пошло не так. Взгляните на раздел «Статус выхода» man wget.



7

Код возврата команды, использованной для загрузки файла, сообщит вам, была ли команда выполнена успешно или нет. Как правило, код возврата 0 обозначает успех, а любое ненулевое число обозначает ошибку. Вы можете получить доступ к коду возврата через $?переменную.

Базовый пример использования wgetбудет идти:

#!/bin/bash

wget foo.tgz &> /dev/null

if [[ "$?" != 0 ]]; then
    echo "Error downloading file"
else
    echo "Success"
fi

&> /dev/nullперенаправляет весь вывод wget, /dev/nullпоэтому он идеально подходит для написания сценариев, НО это затрудняет отладку wgetошибок.


4
Вы могли бы сделать вместо этого:wget -q ... || { handle ; error ; }
mikeserv

@mikeserv Даже не знал, что там было, приятное прикосновение
Крик

1
manЯ нашел это только во время чтения, чтобы ответить, и две вещи, которые я собирался сказать, уже были здесь в двух ответах - поэтому я сделал два комментария. Приятное прикосновение к тебе тоже.
mikeserv

Я ожидаю, что это не будет работать при использовании с SOCKS прокси, такими как tor.
CodesInChaos

1
@Creek Я имел в виду, wgetчто загрузка может быть завершена, даже если она сломалась. Прокси-информация о разорванных TCP-соединениях и закрытых TCP-соединениях, что проблематично с HTTP, поскольку по умолчанию в качестве конечной метки используется закрытый TCP. Вот почему я добавил проверку, соответствует ли размер файла из заголовка размеру загружаемого файла, когда я запустил массовую загрузку. Не уверен wget, проверяет ли такая согласованность или что спецификация http говорит по этому вопросу.
CodesInChaos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.