我需要比较两个文件的内容。两者都是由第三个应用程序生成的。
这些文件看起来像一个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,但这取决于细节,并且最好确保故障安全。)