Existe um método de linha de comando pelo qual eu possa verificar se um arquivo baixado está completo ou quebrado?

8

Estou escrevendo um script que envolve o download e a manipulação de um arquivo, e quero garantir que o arquivo não esteja incompleto (devido a uma conexão descartada, por exemplo) antes de trabalhar nele.

    
por Clare 07.06.2014 / 15:16

2 respostas

9

A maneira mais comum de verificar a integridade dos arquivos baixados é usar somas de verificação MD5. Isso pressupõe que o site que você está baixando de checksums MD5 realmente publicados de seus arquivos. Você pode verificar uma soma de verificação MD5 criando sua própria soma de verificação do arquivo baixado e comparando-o com a soma de verificação publicada. Se eles forem idênticos, o arquivo que você baixou está completo e não foi adulterado.

Se você não espera que o arquivo que você está fazendo o download mude, você pode pré-calcular uma soma de verificação e codificá-lo no script, mas se o arquivo for atualizado, a verificação falhará.

Para criar uma soma de verificação MD5 de uma execução de arquivo md5sum myFile . No caso do wget, você pode achar esse comando útil, especialmente se o arquivo que você está baixando for grande:

wget -O - http://example.com/myFile | tee myFile | md5sum > MD5SUM .

Isto irá criar uma soma de verificação de "myFile" durante o download e salvá-lo no arquivo MD5SUM, possivelmente poupando algum tempo.

No caso de uma conexão perdida, acho que a melhor maneira seria verificar os códigos de saída do wget. Se o download for bem-sucedido sem erros, o wget retornará 0 . Qualquer outra coisa indica que algo deu errado. Dê uma olhada na seção "Sair do status" de man wget .

    
por 07.06.2014 / 15:44
6

O código de retorno do comando usado para baixar o arquivo informará se o comando foi executado com sucesso ou não. Normalmente, um código de retorno de 0 denota sucesso e qualquer número diferente de zero indica um erro. Você pode acessar o código de retorno por meio da variável $? .

Um exemplo básico usando wget seria:

#!/bin/bash

wget foo.tgz &> /dev/null

if [[ "$?" != 0 ]]; then
    echo "Error downloading file"
else
    echo "Success"
fi

&> /dev/null redireciona toda a saída do wget para /dev/null , por isso é ideal para o script, mas torna a depuração wget erros mais difícil.

    
por 07.06.2014 / 15:53