我需要比较两个文件的内容。两者均由第三个应用程序生成。
这些文件看起来像一个env
文件:
VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
...
问题是有时这个应用程序会生成内容:
VAR2=VAL2
VAR1=VAL1
VAR3=VAL3
...
我使用md5sum
它是为了生成一个带有校验和的文件,然后我使用cmp
它来比较它们。
因此,内容相同,但校验和不同。
有什么想法可以解决这个问题吗?
我需要比较两个文件的内容。两者均由第三个应用程序生成。
这些文件看起来像一个env
文件:
VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
...
问题是有时这个应用程序会生成内容:
VAR2=VAL2
VAR1=VAL1
VAR3=VAL3
...
我使用md5sum
它是为了生成一个带有校验和的文件,然后我使用cmp
它来比较它们。
因此,内容相同,但校验和不同。
有什么想法可以解决这个问题吗?
如果文件只包含常量赋值,可以先排序。使用进程替换(Bash/zsh):
(或
cmp -s
像往常一样)如果您必须使用标准外壳,则需要临时文件:
在任何情况下,您都必须确保可以在不改变含义的情况下对文件的行进行排序。多行字符串会被排序破坏,如果你有引用其他变量的赋值,赋值顺序也很重要。
如果您想要哈希,请执行以下操作:
但是,如果您在本地进行比较,那么直接比较文件可能并不重要,因为您需要完整阅读它们以验证它们是否相同,并且
cmp
如果发现差异可以提前停止,虽然sha256sum
不能。如果文件在不同的机器上,那么只传递哈希当然更容易。但即便如此,如果可能的话,我还是建议使用 SHA-256(如上)或 SHA-512 而不是 MD5 (*)。甚至
busybox
implementssha256sum
,所以你也许能够得到它。当然,即使进程替换也可能会求助于临时文件,因此直接比较需要两个已排序的临时文件同时存在,而哈希则不需要。但这仅在文件足够大以至于复制它们会耗尽系统上的存储空间时才有意义。
(* MD5 具有允许产生冲突的已知弱点,而 SHA-2 散列被认为更强。在某些用例中您可以使用 MD5,但这取决于细节,最好是故障安全。)