A resposta de @derobert é ótima, embora eu queira compartilhar outras informações que encontrei.
gzip -l -v
Os arquivos compactados com gzip já contêm um hash (embora não seja seguro, veja este post no SO ):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
Pode-se combinar o CRC e o tamanho não compactado para obter uma impressão digital rápida:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Para verificar se dois bytes são iguais ou não, use cmp file1 file2
. Agora, um arquivo compactado com gzip tem algum cabeçalho com os dados e o rodapé (CRC mais o tamanho original) anexados. A descrição do formato gzip mostra que o cabeçalho contém a hora em que o arquivo foi compactado e que o nome do arquivo é uma sequência terminada em nulo que é anexada após o cabeçalho de 10 bytes.
Portanto, assumindo que o nome do arquivo seja constante e o mesmo comando ( gzip "$name"
) seja usado, é possível verificar se dois arquivos são diferentes usando cmp
e pulando os primeiros bytes, incluindo o horário:
cmp -i 8 file1 file2
Nota : supondo que as mesmas opções de compactação sejam importantes, caso contrário, o comando sempre reportará o arquivo como diferente. Isso acontece porque as opções de compactação são armazenadas no cabeçalho e podem afetar os dados compactados. cmp
apenas analisa os bytes brutos e não os interpreta como gzip.
Se você tiver nomes de arquivos do mesmo tamanho, tente calcular os bytes a serem ignorados depois de ler o nome do arquivo. Quando os nomes de arquivos tiverem tamanhos diferentes, você poderá executar cmp
depois de pular bytes, como cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Este é definitivamente o melhor caminho a seguir, ele primeiro comprime os dados e começa a comparar os bytes com cmp
(realmente, é isso que é feito no shellscript zcmp
( zdiff
)).
Uma nota, não tenha medo da seguinte nota na página de manual:
Quando os dois arquivos devem ser descompactados antes da comparação, o segundo é descompactado para / tmp. Nos demais casos, o zdiff e o zcmp usam apenas um pipe.
Quando você tem um Bash suficientemente novo, a compactação não usa um arquivo temporário, apenas um canal. Ou, como a zdiff
fonte diz:
# Reject Solaris 8's buggy /bin/bash 2.03.