Kann ich das Gegenteil von "diff -q" erreichen - identische Dateien werden abgeglichen, ohne dass deren Inhalt gedruckt wird?

13

Ich habe eine Reihe von Dateien in einem Verzeichnis und möchte überprüfen, ob sie alle eindeutig sind. Der Einfachheit halber sagen wir , ich habe drei Dateien: foo.txt, bar.txtund baz.txt. Wenn ich diese Schleife durchführe, überprüfe ich sie alle gegeneinander:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

Für die Hunderte von Dateien, mit denen ich mich befassen möchte, würde dies ziemlich unlesbar werden. Es wäre besser, die Dateien aufzulisten, die übereinstimmen, und dann kann ich die Liste schnell durchsehen und sicherstellen, dass die Dateien nur mit sich selbst übereinstimmen. Von der Manpage aus hätte ich gedacht, dass die -sOption dies erreichen würde:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

Tatsächlich wird jedoch auch der gesamte Inhalt aller abweichenden Dateien ausgedruckt. Gibt es eine Möglichkeit, dieses Verhalten zu unterdrücken, sodass ich nur das obige Verhalten erhalte?

Alternativ gibt es ein anderes Tool, mit dem dies erreicht werden kann ?

Übelsuppe
quelle

Antworten:

6

Wenn Sie nur prüfen möchten, ob zwei Dateien identisch sind, verwenden Sie cmp. Um eine Ausgabe nur für identische Dateien zu erhalten, können Sie verwenden

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff Es wird versucht, eine kurze, für den Menschen lesbare Liste der Unterschiede zu erstellen. Dies kann sehr viel Zeit in Anspruch nehmen. Vermeiden Sie daher den Overhead, wenn Sie ihn nicht benötigen.

Uwe
quelle
12

Dies sollte den Trick machen:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

wo dir1und dir2sind deine beiden verzeichnisse.

Wenn Sie nur die passenden Verzeichnisse drucken möchten dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

Und auch, wenn Sie nur die passenden Verzeichnisse ausdrucken möchten dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'
j0nam1el
quelle
Genau das habe ich gesucht, danke!
Joshua Soileau
Verwenden Sie diese diff -qrs
Option,
4

Das schnellste dafür geschriebene Tool ist fdupes (es ist in den Paket-Repos von Fedora und Ubuntu verfügbar und ...)

Verwendung:

fdupes -r dir1 dir2
erik
quelle
2

Wenn Sie identische Dateien in einer Liste finden müssen, sortieren Sie diese zunächst nach Größe, z. B. mit

ls -S

Führen md5sumSie dann für jede Gruppe von Dateien mit identischer Größe diese aus, um festzustellen, welche Dateien mit welchen identisch sind.

Bei großen Dateien könnte es schneller sein, zunächst nur ein kurzes Stück der gesamten Datei zu prüfen:

dd if=file bs=512 count=1 | md5sum

Führen Sie dann eine vollständige Prüfsumme nur für verdächtige Dateien durch.

Enzotib
quelle