Führen Sie zwei Verzeichnisse in Linux zusammen, um alle eindeutigen Dateien zu erhalten

518
Dennis

Ich habe Verzeichnisse, nennen wir sie folder1und folder2. In jedem dieser Ordner sind Bilder benannt 1.jpg, 2.jpgund so weiter.

Leider Datei 1.jpgin folder1könnte ein anderes Bild als 1.jpgin folder2. Des Weiteren ist es möglich, die Datei 1.jpgin folder1das gleiche Bild wie 42.jpgin folder2. Daher kann ich den Dateinamen nicht verwenden, um diese Bilder zu unterscheiden.

Die Idee ist jetzt, den Hash anstelle des Dateinamens zu verwenden.

Ziel ist es, beide Ordner in einem dritten zusammenzuführen, so dass der Zielordner alle eindeutigen Bilder beider Ordner enthält.

Gibt es eine einfache Lösung für dieses Problem?

1

3 Antworten auf die Frage

0
Ben Scott

Ich würde einen doppelten Dateisucher (es gibt viele, wählen Sie Ihren Favoriten) in den beiden Ordnern ausführen, um sie auf einen einzigen Satz eindeutiger Inhalte zu reduzieren. Dann wird eine Massenumbenennung von *in folder1_*im ersten Ordner umbenannt, ähnlich wie im zweiten, um eindeutige Namen sicherzustellen. Verbinden Sie dann die beiden mit einer normalen Dateiverschiebung.

0
xenoid

Wenn Sie sich nicht um die Namen kümmern, verschieben Sie die Dateien in jedem Ordner in den Zielordner und benennen Sie sie nach ihrem MD5-Hash um:

for f in folder1/* folder2/*;do mv -nv "$f" target/$(md5sum -b "$f" | cut -d ' ' -f 1); done 

-nDies ist nicht unbedingt erforderlich. Es verhindert, dass die zuerst verschobene Datei durch eine zweite, identische Datei beschädigt wird. Das Endergebnis ist also, dass die Duplikate in ihren Quellverzeichnissen belassen werden und Sie eine Vorstellung davon haben, wie viele Dupes Sie hatten.

Geben Sie ihnen dann ggf. einen anderen Satz willkürlicher Namen (Ausführen in target):

ls | cat -n | while read n f; do mv "$f" "$n.extension"; done 

(ein Liner von hier oben )

-1
Patrick Mevzek

Dies sollte es tun, um ein wenig an Ihre Namenskonventionen anzupassen, und Sie verlieren die ursprünglichen Namen (andernfalls müssen Sie herausfinden, was zu tun ist, wenn Sie zweimal denselben Namen mit unterschiedlichem Inhalt haben).

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$hash ; done 

Oder wenn Sie den ursprünglichen Dateinamen nicht verlieren möchten, ändern Sie ihn einfach:

(for file in folder1/* folder2/* ; do md5sum $file ; done) | sort | awk '' | uniq -f 1 -c | while read count name hash ; do cp $name dest/$(echo $name | sed -e 's/\//_/') ; done 

Der Einfachheit halber gibt es viele Annahmen: Keine Pfade mit Leerzeichen, Ausführen von Aufgaben in beiden Verzeichnissen, Ausgabe in einem Verzeichnis dest/usw. Viele Dinge können je nach Ihren spezifischen Anforderungen behoben werden, aber das oben genannte ist eine funktionierende Basis.