gzip -l -v
Os ficheiros comprimidos para gzip já contêm um hash (não é seguro, consulte esta publicação 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
É possível combinar o CRC e o tamanho descompactado 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 gzipado tem algum cabeçalho com os dados e rodapé (CRC mais 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 string terminada em nul que é anexada após o cabeçalho de 10 bytes.
Assim, assumindo que o nome do arquivo é constante e o mesmo comando ( gzip "$name"
) é usado, pode-se verificar se dois arquivos são diferentes usando cmp
e ignorando os primeiros bytes, incluindo o tempo:
cmp -i 8 file1 file2
Nota : a suposição de que as mesmas opções de compactação são 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ê tem nomes de arquivos do mesmo tamanho, então você poderia tentar calcular os bytes a serem pulados depois de ler o nome do arquivo. Quando os nomes dos arquivos são de tamanhos diferentes, você pode executar cmp
depois de ignorar 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
(na verdade, isso é o que é feito no shell zcmp
( zdiff
)).
Uma nota, não tenha medo da seguinte nota na página do manual:
When both files must be uncompressed before comparison, the second is uncompressed to /tmp. In all other cases, zdiff and zcmp use only a pipe.
Quando você tem um Bash suficientemente novo, a compactação não usará um arquivo temporário, apenas um pipe. Ou, como a fonte zdiff
diz:
# Reject Solaris 8's buggy /bin/bash 2.03.