Jak sprawdzić, czy plik jest uszkodzony, czy nie?

13

Czy istnieją jakieś ogólne rozwiązania pozwalające sprawdzić, czy plik jest uszkodzony? Na przykład, czy plik wideo jest zły, czy plik skompresowany jest uszkodzony itp.

LanceBaynes
źródło
1
Czy pytasz, czy na dysku występuje błąd fizyczny lub czy informacje w pliku są nieprawidłowe?
Thorbjørn Ravn Andersen
2
Sprawdzenie, czy informacje w dowolnym pliku są prawidłowe, jest dość trudne. echo "P = NP" >is-this-corrupt.txt:)
Tom Anderson

Odpowiedzi:

10

Nie, nie ma żadnych ogólnych rozwiązań. Jedynym sposobem sprawdzenia, czy plik jest uszkodzony, jest próba jego odczytania; tylko oprogramowanie potrafiące odczytać ten konkretny format może to zrobić.

Możesz użyć, fileaby zidentyfikować typ pliku, a następnie użyj tego typu, aby wybrać odpowiedni program do sprawdzenia pliku. Możesz napisać taki skrypt:

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

Ale musisz wypełnić dużo pracy, aby wypełnić opis sprawy.

Możliwe, że ktoś już napisał taki skrypt (lub program), ale nie znam żadnego.

Tom Anderson
źródło
1
„tylko oprogramowanie, które potrafi odczytać ten konkretny format, może to zrobić” jest fałszywym założeniem. Istnieje wiele programów, które nie dbają o typ pliku, który im podajesz. (Pomyśl na przykład grep, cat, tar...). Twoje rozwiązanie jest zatem bardzo rozdęte.
rozcietrzewiacz
4
Przez „czytać” rozumiałem „interpretować” - powinienem był być bardziej zrozumiały. Nie można używać catani żadnego innego programu, który traktuje plik wyłącznie jako nieustrukturyzowany strumień bajtów, w celu sprawdzenia jego uszkodzenia. Nie wierzę, że moje rozwiązanie jest rozdęte.
Tom Anderson
Możesz, zgodnie z sugestią Caleba, traktować każdy plik jako dane binarne i przechowywać sumy kontrolne do późniejszej weryfikacji. Jest to uniwersalne, proste i stosunkowo szybkie.
rozcietrzewiacz
1
Ale teraz widzę, że twoje podejście ma tę zaletę, że możesz przeprowadzić weryfikację nawet na plikach, których wcześniej nie widziałeś lub do których nie masz dostępu. To zdecydowanie plus - możesz to wskazać w swojej odpowiedzi.
rozcietrzewiacz
14

Jeśli wiesz, że w pewnym momencie plik jest dobry, możesz zrobić sumę kontrolną i użyć go do późniejszego porównania, aby upewnić się, że nadal jest cały. Jest to przydatne przed przesłaniem plików między mediami lub między sieciami.

Jeśli nie wiesz o dobrym stanie pliku, nie ma uniwersalnego sposobu lub sprawdzania, czy nie ma uszkodzeń. Tylko określony format pliku w każdym przypadku określa, które dane są uszkodzone lub nie.

Caleb
źródło
3

Jeśli zdarzy ci się korzystać z ZFS, możesz odczytać plik i na pewno nie zostanie on uszkodzony lub wystąpił błąd odczytu i tak jest.

Edytuj Po mądrych komentarzach, oto wyjaśnienie mojej odpowiedzi:

ZFS może chronić i wykrywać przed cichym uszkodzeniem danych. np .: http://www.zdnet.com/blog/storage/data-corruption-is-worse-than-you-know/191 Oczywiście, jeśli plik jest już uszkodzony w momencie jego początkowego zapisu, nic nie ma system plików może to zrobić.

Aby zabezpieczyć się przed uszkodzeniem, które nastąpiłoby podczas przesyłania pliku, zwykle stosuje się techniki ogólnego przeznaczenia md5sum lub podobne wartości skrótu.

jlliagre
źródło
wow, co za cecha: O
LanceBaynes
1
Więc jeśli pobierasz uszkodzony film z sieci? ZFS nie robi nic, aby ci w tym pomóc - po prostu sprawdza, czy uszkodzony plik nie ulega zmianie. ZFS jest fantastyczny, ale nie jest to rozwiązanie do sprawdzania uszkodzonych plików.
Tom Anderson,
Niestety jest to tylko kontrola integralności systemu plików, a nie faktyczne zrozumienie plików i tego, czy są uszkodzone. Podejrzewam, że @Lance najpowszechniej korzysta z możliwości decydowania, czy plik przychodzący pobrany lub w inny sposób przesłany jest prawidłowy, czy nie. ZFS nie może magicznie zdecydować, czy plik jest dobry, czy nie, obiecuje tylko, że wszystko, co dasz, zostanie zapisane i zwróci się lokalnie w jednym kawałku.
Caleb
Ponieważ pytanie jest oznaczone jako / data-recovery i / fileystems, założyłem, że chodziło o cichą korupcję danych, a nie o pliki już uszkodzone. Odpowiedź zredagowana w celu wyjaśnienia tego punktu.
jlliagre
@jiliagre: Odpowiedziałem na to pytanie z tym tagiem (być może źle) około godziny po twojej odpowiedzi. Po udzieleniu odpowiedzi oznaczono go po prostu jako „linux”.
Caleb,