staging.inyokaproject.org

Duplikate zwischen 2 Ordnern finden

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

UlfZibis

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

Hallo,

fslint findet leider auch alle Duplikate innerhalb der Ordner – und die sind zahlreich. Wie kann ich die vom Suchergebnis ausschließen?

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1543

Kann es gerade nicht selber testen, aber versuche mal:

1
diff -srq dir1/ dir2/ | grep identisch

Mit den Optionen (eventuell anpassen):

-s  --report-identical-files  Report when two files are the same.
-r  --recursive  Recursively compare any subdirectories found.
-q  --brief  Output only whether files differ.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1543

Sorry, das macht natürlich nicht, was gewünscht ist.

Versuche mal das:

1
comm -12 <(cd dir1 && ls) <(cd dir2 && ls)

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1543

Doch, das erste geht auch.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Was soll denn das Kriterium für Duplikat sein?

Wir hatten hier schon öfters solche Fragen. Wenn es über den Inhalt geht, kann man gut einen Hash wie SHA256 nehmen. Ganz einfach geht:

1
2
3
find /dir1 /dir2 -type f -size +0 -exec sha256sum {} + \
| sort \
| awk '$1 == last {print line; print} $1 != last {last=$1; line=$0}'

Damit hast Du aber noch nicht die doppelten innerhalb eines Verzeichnisses ausgenommen. Dann wird es noch aufwändiger. Aber man erkennt die ja recht einfach optisch.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

Danke themroc für die Tipps.

Das 2. Beispiel wird nicht funktionieren, da es nur gleiche Dateinamen findet. Ich habe sowohl Dateien mit gleichem Inhalt und verschiedenen Namen als auch Dateien mit gleichem Namen, aber unterschiedlichem Inhalt. Für meine Suche kommt es auf die (Un-)Gleichheit des Inhalts an.

Beim 1. Beispiel bin ich mir auch nicht so sicher, denn diff vergleicht zeilenweise, was bei z.B. Videodateien keinen Sinn macht.

Ich habe aber jetzt eine Zusatzfunktion in FSlint entdeckt, welche mein Problem quasi löst. Über "Auswahl mit Platzhalter" kann ich alle Ergebniszeilen mit z.B. Pfad von Ordner 1 selektiv markieren und die dann gezielt löschen. Einziger Pferdefuß: bei einer sehr langen Ergebnisliste ist es mühsam, die so markierten Zeilen zu finden, um zu kontrollieren, ob auch die richtigen Zeilen markiert wurden. Schade, dass man FSlint so eine eingeschränkte Suche nicht direkt so vorgeben kann.

Ansonsten hilft noch die umständliche Nachbearbeitung, die ich hier nachgefragt habe.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 2726

rklm schrieb:

Was soll denn das Kriterium für Duplikat sein?

Genau das gleiche, welches FSlint verwendet, die Inhaltsgleichheit.

Damit hast Du aber noch nicht die doppelten innerhalb eines Verzeichnisses ausgenommen.

Genau, und damit bin ich nicht weiter, wie mit FSlint, dennoch ein interessanter Ansatz, danke dafür. FSlint ist aber noch genauer, denn soweit ich weiß, prüft es für Dateien mit gleichem Hash dann anschließend noch den Inhalt auf exakte Gleichheit.

Dann wird es noch aufwändiger.

Genau!

Aber man erkennt die ja recht einfach optisch.

Solange es sich dabei nur um wenige zig Ergebniszeilen handelt, schon, doch bei mir sind es tausende mit nur sehr wenigen Treffern für den 1. Ordner.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

UlfZibis schrieb:

rklm schrieb:

Was soll denn das Kriterium für Duplikat sein?

Genau das gleiche, welches FSlint verwendet, die Inhaltsgleichheit.

OK.

Damit hast Du aber noch nicht die doppelten innerhalb eines Verzeichnisses ausgenommen.

Genau, und damit bin ich nicht weiter, wie mit FSlint, dennoch ein interessanter Ansatz, danke dafür. FSlint ist aber noch genauer, denn soweit ich weiß, prüft es für Dateien mit gleichem Hash dann anschließend noch den Inhalt auf exakte Gleichheit.

Das dürfte bei SHA256 ziemlich überflüssig sein.

Dann wird es noch aufwändiger.

Genau!

Aber man erkennt die ja recht einfach optisch.

Solange es sich dabei nur um wenige zig Ergebniszeilen handelt, schon, doch bei mir sind es tausende mit nur sehr wenigen Treffern für den 1. Ordner.

Dann würde ich das so machen:

  • Beide Verzeichnisse oder Verzeichnisbäume durchsuchen

  • Für jede gefundene Datei

    • SHA256 ermitteln

    • Größe, vollen Pfad und den Hash merken (s.u.)

  • Datenstruktur durchsuchen und für alle Hashes, die mehr als einen Datensatz haben

    • Falls nicht alle Dateien dieselbe Länge haben

      • Warnung ausgeben

    • Falls mindestens zwei Dateien in unterschiedlichen Ordnern liegen

      • alle Dateinamen ausgeben

Als Datenstruktur würde ich eine Hashtabelle benutzen mit SHA256 als Schlüssel und einer Liste von Tupeln aus (Dateiname, Größe). Ich würde das in Ruby implementieren, weil die Shell dann doch ein bisschen eklig ist. Shellskript mit awk ginge zwar auch, wäre mir in diesem Fall aber zu umständlich.

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1543

Das habe ich noch gefunden:

1
2
3
find DirA -exec md5sum {} +  > /tmp/a
find DirB -exec md5sum {} +  > /tmp/b
awk 'FNR==NR{s=$1;md5[s];$1="";name[s]=$0;next}$1 in md5{s=$1;$1="";print name[s] " : " $0}' /tmp/[ab]

themroc

Avatar von themroc

Anmeldungsdatum:
5. November 2006

Beiträge: 1543

Besser so:

1
2
3
find DirA -type f -exec md5sum {} +  > /tmp/a
find DirB -type f -exec md5sum {} +  > /tmp/b
awk 'FNR==NR{s=$1;md5[s];$1="";name[s]=$0;next}$1 in md5{s=$1;$1="";print name[s] " : " $0}' /tmp/[ab]
Antworten |