Shell: compare o arquivo de conteúdo e não as somas de verificação

2

Eu preciso comparar o conteúdo de dois arquivos. Ambos são gerados por um terceiro aplicativo.

Os arquivos parecem um arquivo env :

VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
...

O problema é que às vezes esse aplicativo gera o conteúdo:

VAR2=VAL2
VAR1=VAL1
VAR3=VAL3
...

Estou usando md5sum para gerar um arquivo com somas de verificação e, em seguida, uso cmp para compará-las.

O conteúdo é o mesmo, mas o checksums é diferente.

Alguma ideia para resolver isso?

    
por Jordi 04.07.2018 / 12:57

1 resposta

7

Se os arquivos contiverem apenas atribuições constantes, você poderá classificá-los primeiro. Com a substituição do processo (Bash / zsh):

cmp <(sort foo) <(sort bar)

(ou cmp -s como de costume)

Se você tiver que fazer com um shell padrão, precisará de arquivos temporários:

a=$(mktemp) b=$(mktemp)
sort foo > "$a"; sort bar > "$b"
cmp "$a" "$b"
rm "$a" "$b"

Em qualquer caso, você precisará ter certeza de que as linhas dos arquivos podem ser classificadas sem alterar o significado. Seqüências de várias linhas seriam quebradas pelo tipo e, se você tiver atribuições que se referem a outras variáveis, a ordem de atribuição também seria importante.

Se você quiser o hash, faça algo como:

cksum1=$(sort foo | sha256sum)
cksum2=$(sort bar | sha256sum)

Mas se você está comparando localmente, provavelmente não importa muito se você comparar os arquivos diretamente, já que precisa lê-los por completo para verificar se são iguais e cmp pode parar cedo se notar uma diferença, enquanto sha256sum não pode.

Se os arquivos estiverem em máquinas separadas, passar apenas o hash é mais fácil. Mas, mesmo assim, sugiro usar SHA-256 (como acima) ou SHA-512 em vez de MD5, se possível (*) . Mesmo busybox implementa sha256sum , então você pode conseguir isso.

Naturalmente, até mesmo a substituição de processos pode recorrer a arquivos temporários; portanto, a comparação direta precisa que os arquivos temporários classificados existam ao mesmo tempo, sem considerar o hash. Mas isso só deve importar se os arquivos forem grandes o suficiente para que a duplicação deles acabe o armazenamento no sistema.

(* MD5 tem fraquezas conhecidas que permitem gerar colisões, enquanto os hashes SHA-2 são considerados mais strongs. Você pode usar o MD5 em alguns casos de uso, mas isso depende dos detalhes e é melhor falhar .)

    
por 04.07.2018 / 13:15

Tags