Como verificar se um arquivo está corrompido ou não?

13

Existem soluções gerais para verificar se um arquivo está corrompido ou não? Por exemplo, se um arquivo de vídeo está incorreto ou se um arquivo compactado está corrompido, etc.

LanceBaynes
fonte
1
Você pergunta se há um erro físico no disco ou se as informações no arquivo estão incorretas?
Thorbjørn Ravn Andersen
2
Verificar se as informações em um arquivo arbitrário estão corretas é bastante complicado. echo "P = NP" >is-this-corrupt.txt:)
Tom Anderson

Respostas:

10

Não, não há soluções gerais. A única maneira de verificar se um arquivo está corrompido é tentar lê-lo; somente o software que sabe ler esse formato específico pode fazer isso.

O que você pode fazer é usar filepara identificar o tipo do arquivo e, em seguida, usar o tipo para escolher um programa apropriado para verificar o arquivo. Você pode escrever um script como este:

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

Mas você teria muito trabalho a fazer para preencher a declaração do caso.

É possível que alguém já tenha escrito um script (ou programa), mas eu não conheço nenhum.

Tom Anderson
fonte
1
"somente o software que sabe ler esse formato específico pode fazer isso" é uma suposição falsa. Existem muitos programas que não se importam com o tipo de arquivo que você fornece. (Pense, por exemplo grep, cat, tar...). Sua solução é, portanto, muito inchada.
rozcietrzewiacz
4
Por "ler", eu quis dizer "interpretar" - eu deveria ter sido mais claro. Você não pode usar cat, ou qualquer outro programa que trate um arquivo apenas como um fluxo não estruturado de bytes, para verificar se há corrupção. Não acredito que minha solução esteja inchada.
Tom Anderson
Como Caleb sugeriu , você pode tratar cada arquivo como dados binários e armazenar somas de verificação para verificação posterior. Isso é universal, simples e relativamente rápido.
rozcietrzewiacz
1
Mas agora vejo que sua abordagem tem o benefício de poder realizar a verificação mesmo em arquivos que você não viu ou acessou anteriormente. Definitivamente, isso é uma vantagem - você pode apontar na sua resposta.
rozcietrzewiacz
14

Se, em algum momento, você souber que o arquivo está bom, faça uma soma de verificação e use-a para comparar posteriormente para garantir que ainda esteja inteiro. Isso é útil antes de transferir arquivos entre mídias ou redes.

Se você não souber o bom estado de um arquivo, não há uma maneira universal ou verificará se há corrupção. Somente o formato de arquivo específico em cada caso determina o que está corrompido ou não está corrompido.

Caleb
fonte
3

Se você usar o ZFS, poderá ler o arquivo e é garantido que não está corrompido ou você recebeu um erro de leitura.

Editar Após os sábios comentários, aqui está um esclarecimento da minha resposta:

O ZFS pode proteger e detectar contra corrupção de dados silenciosa. por exemplo: http://www.zdnet.com/blog/storage/data-corruption-is-worse-than-you-know/191 Obviamente, se o arquivo já estiver corrompido no momento em que foi inicialmente escrito, não há nada o sistema de arquivos pode fazer.

Para se proteger contra a corrupção que aconteceria durante a transmissão do arquivo, as técnicas comuns de uso geral são md5sum ou hashes semelhantes.

jlliagre
fonte
uau, que recurso: O
LanceBaynes
1
Então, se você baixar um vídeo da Web que está corrompido? O ZFS não ajuda em nada - apenas verifica se o arquivo corrompido não foi alterado. O ZFS é fantástico, mas não é uma solução para verificar arquivos corrompidos.
Tom Anderson
Infelizmente, isso é apenas uma verificação de integridade do sistema de arquivos, não um entendimento real dos arquivos e se eles estão corrompidos. O uso mais comum que suspeito que o @Lance é depois é poder decidir se um arquivo recebido baixado ou transferido é válido ou não. O ZFS não pode magicamente decidir se um arquivo é bom ou não, apenas promete que tudo o que você fornecer será salvo e retornado localmente.
Caleb
Como a pergunta está marcada como / data-recovery e / filesystems, presumi que se tratava de corrupção de dados silenciosa, não de arquivos já quebrados em primeiro lugar. Resposta editada para esclarecer esse ponto.
Jlliagre
@ jiliagre: reencaminhei esta pergunta com essa tag (possivelmente incorretamente) cerca de uma hora após a sua resposta. Quando você respondeu, era simplesmente marcado com "linux".
Caleb