Comment vérifier si un fichier est corrompu ou non?

13

Existe-t-il des solutions générales pour vérifier si un fichier est corrompu ou non? Par exemple, si un fichier vidéo est mauvais ou si un fichier compressé est corrompu, etc.

LanceBaynes
la source
1
Demandez-vous s'il y a une erreur physique sur le disque ou si les informations du fichier sont incorrectes?
Thorbjørn Ravn Andersen
2
Il est assez difficile de vérifier si les informations contenues dans un fichier arbitraire sont correctes. echo "P = NP" >is-this-corrupt.txt:)
Tom Anderson

Réponses:

10

Non, il n'y a pas de solutions générales. La seule façon de vérifier si un fichier est corrompu est d'essayer de le lire; seuls les logiciels qui savent lire ce format particulier peuvent le faire.

Ce que vous pourriez faire, c'est utiliser filepour identifier le type du fichier, puis utiliser le type pour choisir un programme approprié pour vérifier le fichier. Vous pouvez écrire un script comme celui-ci:

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

Mais vous auriez beaucoup de travail à faire pour remplir l'énoncé de cas.

Il est possible que quelqu'un ait déjà écrit un tel script (ou programme), mais je n'en connais aucun.

Tom Anderson
la source
1
«seul un logiciel qui sait lire ce format particulier peut le faire» est une fausse hypothèse. Il existe de nombreux programmes qui ne se soucient pas du type de fichier que vous leur donnez. (Pensez par exemple grep, cat, tar...). Votre solution est donc très gonflée.
rozcietrzewiacz
4
Par "lire", je voulais dire "interpréter" - j'aurais dû être plus clair. Vous ne pouvez pas utiliser cat, ni aucun autre programme qui traite un fichier uniquement comme un flux d'octets non structuré, pour vérifier la corruption. Je ne crois pas que ma solution soit gonflée.
Tom Anderson
Vous pouvez, comme l'a suggéré Caleb, traiter chaque fichier comme des données binaires et stocker des sommes de contrôle pour une vérification ultérieure. C'est universel, simple et relativement rapide.
rozcietrzewiacz
1
Mais je vois maintenant que votre approche présente l'avantage que vous pouvez effectuer la vérification même sur des fichiers que vous n'avez pas vus ou auxquels vous n'avez pas accédé plus tôt. C'est certainement un plus - vous pouvez le signaler dans votre réponse.
rozcietrzewiacz
14

Si vous savez à un moment donné que le fichier est bon, vous pouvez en faire une somme de contrôle et l'utiliser pour comparer plus tard afin de vous assurer qu'il est toujours entier. Ceci est utile avant de transférer des fichiers entre supports ou entre réseaux.

Si vous ne connaissez pas le bon état d'un fichier, non, il n'y a pas de moyen universel ou de vérification de la corruption. Seul le format de fichier spécifique dans chaque cas détermine ce qui est corrompu ou non corrompu.

Caleb
la source
3

Si vous utilisez ZFS, soit vous pouvez lire le fichier et il est garanti qu'il n'est pas corrompu, soit vous avez une erreur de lecture et c'est le cas.

Modifier Après les sages commentaires, voici une clarification de ma réponse:

ZFS peut protéger et détecter contre la corruption silencieuse des données. par exemple: http://www.zdnet.com/blog/storage/data-corruption-is-worse-than-you-know/191 Bien sûr, si le fichier est déjà corrompu au moment où il est initialement écrit, il n'y a rien le système de fichiers peut faire.

Pour se protéger contre la corruption qui se produirait lors de la transmission du fichier, les techniques d'usage général habituelles sont md5sum ou hachages similaires.

jlliagre
la source
wow, quelle fonctionnalité: O
LanceBaynes
1
Donc, si vous téléchargez sur le Web une vidéo corrompue? ZFS ne fait rien pour vous y aider - il vérifie simplement que le fichier corrompu n'est pas modifié. ZFS est fantastique, mais ce n'est pas une solution pour vérifier les fichiers corrompus.
Tom Anderson
Malheureusement, ce n'est qu'une vérification de l'intégrité du système de fichiers, pas une compréhension réelle des fichiers et s'ils sont corrompus. L'utilisation la plus courante que je soupçonne que @Lance est après est de pouvoir décider si un fichier entrant téléchargé ou transféré est valide ou non. ZFS ne peut pas décider par magie si un fichier est bon ou non, promettez seulement que tout ce que vous lui donnez est enregistré et retourné localement en un seul morceau.
Caleb
Comme la question est balisée / data-recovery et / filesystems, j'ai supposé qu'il s'agissait d'une corruption silencieuse des données, pas de fichiers déjà cassés en premier lieu. Réponse modifiée pour clarifier ce point.
jlliagre
@jiliagre: J'ai retagé cette question avec cette balise (peut-être à tort) environ une heure après votre réponse. Lorsque vous y avez répondu, il était simplement étiqueté "linux".
Caleb