Как проверить, поврежден ли файл или нет?

13

Существуют ли общие решения, чтобы проверить, поврежден ли файл или нет? Например, является ли видеофайл плохим или сжатый файл поврежден и т. Д.

LanceBaynes
источник
1
Вы спрашиваете, есть ли физическая ошибка на диске или информация в файле неверна?
Турбьёрн Равн Андерсен
2
Проверить правильность информации в произвольном файле довольно сложно. echo "P = NP" >is-this-corrupt.txt:)
Том Андерсон

Ответы:

10

Нет, общих решений нет. Единственный способ проверить, не поврежден ли файл, - это попробовать и прочитать его; это может делать только программное обеспечение, которое умеет читать этот конкретный формат.

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

# /bin/bash -eu

FILENAME=$1

FILETYPE="$(file -b $FILENAME | head -1 | cut -d , -f 1)"
case "$FILETYPE" in
    "gzip compressed data") CHECKER="gunzip -t" ;;
    # many, many more lines here
    *) echo "Unknown type: $FILETYPE"; exit 1 ;;
esac

$CHECKER $FILENAME

Но у вас будет много работы, чтобы заполнить заявление по делу.

Возможно, кто-то уже написал такой сценарий (или программу), но я не знаю ни одного.

Том Андерсон
источник
1
«Только программное обеспечение, которое знает, как читать этот конкретный формат, может сделать это» - ложное предположение. Есть много программ, которые не заботятся о типе файла, который вы им даете. (Подумайте, например grep, cat, tar...). Ваше решение поэтому очень раздутый.
rozcietrzewiacz
4
Под «читать» я имел в виду «интерпретировать» - я должен был быть более ясным. Вы не можете использовать catили любую другую программу, которая рассматривает файл исключительно как неструктурированный поток байтов, для проверки на наличие повреждений. Я не верю, что мое решение раздуто.
Том Андерсон
Вы можете, как предложил Калеб, рассматривать каждый файл как двоичные данные и сохранять контрольные суммы для последующей проверки. Это универсально, просто и относительно быстро.
rozcietrzewiacz
1
Но теперь я вижу, что ваш подход имеет то преимущество, что вы можете выполнять проверку даже для файлов, которые вы не видели или к которым ранее не обращались. Это определенно плюс - вы можете указать это в своем ответе.
rozcietrzewiacz
14

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

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

Калеб
источник
3

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

Изменить После мудрых комментариев, вот пояснение моего ответа:

ZFS может защитить и обнаружить от молчаливого повреждения данных. например: http://www.zdnet.com/blog/storage/data-corruption-is-worse-than-you-know/191 Конечно, если файл уже поврежден во время первоначальной записи, ничего не происходит файловая система может сделать.

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

jlliagre
источник
вау, что за функция: O
LanceBaynes
1
Так что, если вы загружаете видео из Интернета, оно повреждено? ZFS ничего не делает, чтобы помочь вам - он просто проверяет, не поврежден ли поврежденный файл. ZFS - это фантастика, но это не решение для проверки поврежденных файлов.
Том Андерсон
К сожалению, это всего лишь проверка целостности файловой системы, а не фактическое понимание файлов и их повреждения. Я подозреваю, что наиболее частое использование @Lance - это возможность определить, является ли входящий файл загруженным или переданным другим способом, действительным или нет. ZFS не может волшебным образом решить, является ли файл хорошим или нет, только пообещать, что все, что вы дадите, будет сохранено и возвращено одним куском локально.
Калеб
Поскольку вопрос помечен как / восстановление данных и / файловые системы, я предположил, что речь идет о повреждении данных без вывода сообщений, а не о файлах, которые уже были повреждены. Ответ отредактирован, чтобы прояснить этот момент.
Jlliagre
@jiliagre: Я пометил этот вопрос с этим тегом (возможно, неправильно) примерно через час после вашего ответа. Когда вы ответили, он просто был помечен как «linux».
Калеб