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

Я просто попробовал nano, и то, что я нашел самым удивительным, является этим, даже не предупреждает Вас, что файл только для чтения, когда Вы начинаете пытаться отредактировать файл. (ОБНОВЛЕНИЕ: По-видимому, нано 2.2 действительно предупреждает; 2.0 не делает.)

Вот (основной) сценарий, который делает это.

Это проверяет, можно ли отредактировать файл, и если Вы не можете, это выполнить "нано" как корень вместо этого.

/usr/local/bin/edit (или ~/bin/edit)

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

И команда я звонил view так, чтобы можно было избежать подсказки, если Вы знаете, что не собираетесь вносить любые изменения.

/usr/local/bin/view (или ~/bin/view)

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Уже существует названная программа view это - часть Vi/Vim, поэтому не стесняйтесь предлагать лучшее имя.
(Но я думаю, что полное внедрение этой программы сделало бы Vi view избыточный.)


Полные версии

13
17.06.2011, 16:36
3 ответа

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

То, что Вы могли сделать, использовать 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

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

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

10
27.01.2020, 19:52
  • 1
    "только программное обеспечение, которое знает, как читать, что конкретный формат может сделать это", является ложным предположением. Существует много программ, которые не заботятся о типе файла, который Вы даете им. (Думайте, например, grep, cat, tar ...). Ваше решение поэтому очень чрезмерно увеличено в размерах. –  rozcietrzewiacz 15.08.2011, 15:03
  • 2
    "Чтением" я имел в виду, "интерпретируют" - я должен был быть более ясным. Вы не можете использовать cat, или любая другая программа, которая рассматривает файл просто как неструктурированный поток байтов, для проверки на повреждение. Я не полагаю, что мое решение чрезмерно увеличено в размере. –  Tom Anderson 15.08.2011, 16:14
  • 3
    Вы можете, как Caleb предположил, рассматривают каждый файл как двоичные данные и хранят контрольные суммы для более поздней проверки. Это универсально, просто и относительно быстро. –  rozcietrzewiacz 15.08.2011, 16:21
  • 4
    , Но я вижу теперь, когда Ваш подход обладает преимуществом, что Вы могли выполнить проверку даже на файлах, которые Вы не видели или получили доступ ранее. Это определенно плюс - Вы могли бы указать на это в своем ответе. –  rozcietrzewiacz 15.08.2011, 16:25

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

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

14
27.01.2020, 19:52

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

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

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

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

3
27.01.2020, 19:52
  • 1
    , ничего себе, какая функция: O –  LanceBaynes 17.06.2011, 13:23
  • 2
    Поэтому, если Вы загружаете видео с сети, это повреждено? ZFS не делает ничего для помощи Вам там - он просто проверяет, что поврежденный файл не становится измененным. ZFS является фантастическим, но это не решение проверки поврежденные файлы. –  Tom Anderson 17.06.2011, 13:24
  • 3
    Unfortunatly это - просто проверка целостности файловой системы, не фактическое понимание файлов и повреждены ли они. Наиболее распространенное использование я подозреваю @Lance, после способность решить, является ли входящий загруженный файл или иначе переданный правильным или нет. ZFS не может волшебно решить, хорош ли файл или нет, только обещайте, что независимо от того, что Вы даете его, сохраняется и возвращается в одной части локально. –  Caleb 17.06.2011, 13:51
  • 4
    Поскольку вопрос отмечен/data-recovery и / файловые системы, я предположил, что это было о тихом повреждении данных, не о файлах, уже поврежденных во-первых. Ответ, отредактированный для прояснения той мысли. –  jlliagre 17.06.2011, 14:41
  • 5
    @jiliagre: Я повторно отметил этот вопрос с тем тегом (возможно неправильно) спустя приблизительно час после Вашего ответа. Когда Вы ответили на это, это было просто отмечено "Linux". –  Caleb 17.06.2011, 15:02

Теги

Похожие вопросы