Shell:比较内容文件而不是校验和

Shell:比较内容文件而不是校验和

我需要比较两个文件的内容。两者都是由第三个应用程序生成的。

这些文件看起来像一个env文件:

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

问题是有时该应用程序会生成以下内容:

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

我使用它md5sum来生成带有校验和的文件,然后使用它cmp来比较它们。

因此,内容相同,但校验和不同。

有什么想法可以解决这个问题吗?

答案1

如果文件只包含常量赋值,您可以先对它们进行排序。使用进程替换(Bash/zsh):

cmp <(sort foo) <(sort bar)

(或cmp -s像往常一样)

如果您必须使用标准 shell,则需要临时文件:

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

无论如何,您必须确保可以对文件的行进行排序而不改变含义。多行字符串会被排序破坏,如果您有引用其他变量的赋值,则赋值顺序也很重要。

如果你想要哈希值,请执行以下操作:

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

但是,如果您在本地进行比较,那么直接比较文件可能并不重要,因为您需要完整阅读它们以验证它们是否相同,并且cmp如果发现差异可以提前停止,而sha256sum不能。

如果文件位于不同的计算机上,那么仅传递哈希值当然会更容易。但即便如此,如果可能的话,我还是建议使用 SHA-256(如上所述)或 SHA-512 而不是 MD5 (*)。甚至busybox实现了sha256sum,所以你也许能够得到它。

当然,即使是进程替换也可能会诉诸临时文件,因此直接比较需要两个已排序的临时文件同时存在,而采用哈希则不需要。但只有当文件足够大以至于复制它们会耗尽系统上的存储空间时,这才有意义。

(* MD5 已知有可能产生冲突的弱点,而 SHA-2 哈希值被认为更强。在某些用例中,您可以使用 MD5,但这取决于细节,并且最好确保故障安全。)

相关内容