Diff

如何顯示哪個文件與其他文件不同

  • November 3, 2020

我正在嘗試編寫一個腳本來從 5 個不同的地方獲取資訊並比較它們的差異。這些資訊只是 IP 地址,我將它們放在文本文件中。我正在使用:

diff --from-file file1 file2 file3 file4 file5

比較它們並且它有效,但我需要顯示哪個文件包含不同的資訊。我希望只有一個或最多兩個文件不匹配。

如果將 diff 格式更改為 unity with -uor --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

或者你可以像這樣將它與uniq結合起來:

# 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)

引用自:https://unix.stackexchange.com/questions/166236