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 .)