如何显示哪个文件与其他文件不同

如何显示哪个文件与其他文件不同

我正在尝试编写一个脚本来从 5 个不同的地方获取信息并比较它们的差异。这些信息只是 IP 地址,我将它们放在文本文件中。我在用着:

diff --from-file file1 file2 file3 file4 file5

比较它们并且它有效,但我需要显示哪个文件包含不同的信息。我预计只有一个或最多两个文件不匹配。

答案1

如果您将 diff 格式更改为统一的-u--unified,则会显示文件名。

# diff -u --from-file file1 file[2-5]
--- file1   2020-10-30 11:02:22.223269990 +0200
+++ file3   2020-10-30 11:02:35.445984702 +0200
@@ -1 +1 @@
-original
+new
--- file1   2020-10-30 11:02:22.223269990 +0200
+++ file5   2020-10-30 11:02:40.625872942 +0200
@@ -1 +1 @@
-original
+new

-q您还可以使用带有或 的简短输出--brief

# diff -q --from-file file1 file[2-5]
Files file1 and file3 differ
Files file1 and file5 differ

另一种解决方案可能是对所有文件运行校验和程序,例如 md5sum、sha1sum 等,并查看哪个文件的校验和与第一个文件不同。

在 GNU 系统上你甚至可以将它与awk像这样:

# md5sum file* | awk '{h[$1] = h[$1] " " $2} END {for(k in h) printf("%s:%s\n", k, h[k])}'
88fa9f694690e11239096536ccf2702b: file1 file2 file4
9cd599a3523898e6a12e13ec787da50a: file3 file5

或者你可以将它与独特的像这样:

# hashlen=32  # MD5 outputs 32 hexadecimals
# md5sum file* | sort | uniq --group --check-chars=${hashlen}
88fa9f694690e11239096536ccf2702b  file1
88fa9f694690e11239096536ccf2702b  file2
88fa9f694690e11239096536ccf2702b  file4

9cd599a3523898e6a12e13ec787da50a  file3
9cd599a3523898e6a12e13ec787da50a  file5

在 FreeBSD 系统上你可以将它与awk像这样:

# md5 file* | awk -F ' = ' '{h[$2] = h[$2] " " substr($1, index($1, "("))} END {for(k in h) printf("%s:%s\n", k, h[k])}' 
9cd599a3523898e6a12e13ec787da50a: (file3) (file5)
88fa9f694690e11239096536ccf2702b: (file1) (file2) (file4)

答案2

扩散可以处理 5 个输入(sudo apt-get install diff)。从手册页:

Diffuse is a graphical tool for merging and comparing text files. Diffuse is able
to compare an arbitrary number of files side-by-side and gives users the ability
to manually adjust line matching and directly edit files.

答案3

如果只有一个文件不同,那么您可以使用类似

md5sum file* | uniq -f 2

uniq -f 2将避免字段 2(文件名)。

相关内容