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

Jor*_*rdi 3 shell

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

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

VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
...
Run Code Online (Sandbox Code Playgroud)

问题是有时这个应用程序会生成内容:

VAR2=VAL2
VAR1=VAL1
VAR3=VAL3
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

ilk*_*chu 7

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

cmp <(sort foo) <(sort bar)
Run Code Online (Sandbox Code Playgroud)

(或cmp -s像往常一样)

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

a=$(mktemp) b=$(mktemp)
sort foo > "$a"; sort bar > "$b"
cmp "$a" "$b"
rm "$a" "$b"
Run Code Online (Sandbox Code Playgroud)

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

如果你想要散列,请执行以下操作:

cksum1=$(sort foo | sha256sum)
cksum2=$(sort bar | sha256sum)
Run Code Online (Sandbox Code Playgroud)

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

如果文件在不同的机器上,那么只传递散列当然更容易。但即便如此,如果可能的话,我还是建议使用 SHA-256(如上所述)或 SHA-512 而不是 MD5 (*)。即使是busyboximplements sha256sum,所以你也许能够得到它。

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

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

  • @Jordi 你_真的_不需要为此计算 MD5 校验和。这样做会比使用 `cmp` 慢得多。 (2认同)