Wie kann ich überprüfen, ob eine Datei beschädigt ist oder nicht?

13

Gibt es allgemeine Lösungen, um zu überprüfen, ob eine Datei beschädigt ist oder nicht? Beispielsweise, ob eine Videodatei fehlerhaft oder eine komprimierte Datei beschädigt ist usw.

LanceBaynes
quelle
1
Fragen Sie, ob ein physischer Fehler auf der Festplatte vorliegt oder ob die Informationen in der Datei falsch sind?
Thorbjørn Ravn Andersen
2
Es ist ziemlich schwierig zu überprüfen, ob die Informationen in einer beliebigen Datei korrekt sind. echo "P = NP" >is-this-corrupt.txt:)
Tom Anderson

Antworten:

10

Nein, es gibt keine generellen Lösungen. Die einzige Möglichkeit, zu überprüfen, ob eine Datei beschädigt ist, besteht darin, sie zu lesen. Das kann nur eine Software, die dieses Format lesen kann.

Sie können fileden Dateityp ermitteln und dann mit dem Dateityp ein geeignetes Programm zum Überprüfen der Datei auswählen. Sie könnten ein Skript wie das folgende schreiben:

# /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

Aber Sie müssten eine Menge Arbeit aufbringen, um die Fallaussage auszufüllen.

Es ist möglich, dass jemand bereits ein solches Skript (oder Programm) geschrieben hat, aber ich kenne keine.

Tom Anderson
quelle
1
"Das kann nur Software, die weiß, wie man dieses bestimmte Format liest", ist eine falsche Annahme. Es gibt viele Programme, die sich nicht für den Dateityp interessieren, den Sie ihnen geben. (Denken Sie zum Beispiel grep, cat, tar...). Ihre Lösung ist daher sehr aufgebläht.
Rozcietrzewiacz
4
Mit "lesen" meinte ich "interpretieren" - ich hätte klarer sein sollen. Mit catkeinem anderen Programm, das eine Datei lediglich als unstrukturierten Bytestrom behandelt, können Sie nach Beschädigungen suchen. Ich glaube nicht, dass meine Lösung aufgebläht ist.
Tom Anderson
Sie können, wie von Caleb vorgeschlagen , jede Datei als Binärdaten behandeln und Prüfsummen für eine spätere Überprüfung speichern. Dies ist universell, einfach und relativ schnell.
Rozcietrzewiacz
1
Aber ich sehe jetzt, dass Ihr Ansatz den Vorteil hat, dass Sie die Überprüfung auch für Dateien durchführen können, auf die Sie zuvor noch nicht zugegriffen haben. Dies ist auf jeden Fall ein Pluspunkt - Sie könnten es in Ihrer Antwort darauf hinweisen.
Rozcietrzewiacz
14

Wenn Sie zu einem bestimmten Zeitpunkt wissen, dass die Datei fehlerfrei ist, können Sie eine Prüfsumme daraus erstellen und diese später zum Vergleichen verwenden, um sicherzustellen, dass sie noch vollständig ist. Dies ist nützlich, bevor Sie Dateien zwischen Medien oder über Netzwerke übertragen.

Wenn Sie nicht über den ordnungsgemäßen Zustand einer Datei informiert sind, gibt es keinen universellen Weg oder keine Überprüfung auf Beschädigung. Nur das jeweilige Dateiformat bestimmt, welche Daten fehlerhaft oder nicht fehlerhaft sind.

Caleb
quelle
3

Wenn Sie ZFS verwenden, können Sie entweder die Datei lesen und sie wird garantiert nicht beschädigt, oder Sie haben einen Lesefehler und das ist der Fall.

Nach den weisen Kommentaren ist hier eine Klarstellung meiner Antwort:

ZFS kann vor unbeaufsichtigter Datenbeschädigung schützen und diese erkennen. Beispiel: http://www.zdnet.com/blog/storage/data-corruption-is-worse-than-you-know/191 Wenn die Datei zum Zeitpunkt des ersten Schreibens bereits beschädigt ist, gibt es natürlich nichts das Dateisystem kann.

Zum Schutz vor Beschädigung, die während der Übertragung der Datei auftreten würde, sind md5sum oder ähnliche Hashes die üblichen Allzwecktechniken.

jlliagre
quelle
Wow, was für ein Feature: O
LanceBaynes
1
Wenn Sie also ein Video aus dem Internet herunterladen, das beschädigt ist? ZFS tut nichts, um Ihnen dabei zu helfen - es überprüft nur, dass die beschädigte Datei nicht geändert wird. ZFS ist fantastisch, aber keine Lösung, um nach beschädigten Dateien zu suchen.
Tom Anderson
Leider handelt es sich nur um eine Überprüfung der Integrität des Dateisystems, nicht um ein tatsächliches Verständnis der Dateien und ob sie beschädigt sind. Ich vermute, dass @Lance am häufigsten verwendet wird, wenn es darum geht, zu entscheiden, ob eine heruntergeladene oder auf andere Weise übertragene eingehende Datei gültig ist oder nicht. ZFS kann nicht auf magische Weise entscheiden, ob eine Datei fehlerfrei ist oder nicht. Sie können nur versprechen, dass alles, was Sie angeben, lokal in einem Stück gespeichert und zurückgegeben wird.
Caleb
Da die Frage mit / data-recovery und / filesystems gekennzeichnet ist, ging ich davon aus, dass es sich um eine unbeaufsichtigte Datenbeschädigung handelt und nicht um Dateien, die bereits beschädigt wurden. Antwort bearbeitet, um diesen Punkt zu klären.
Juli
@jiliagre: Ich habe diese Frage mit diesem Tag (möglicherweise zu Unrecht) etwa eine Stunde nach Ihrer Antwort wiederholt. Als du geantwortet hast, war es einfach mit "linux" markiert.
Caleb