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.
Führen Sie zwei Verzeichnisse in Linux zusammen, um alle eindeutigen Dateien zu erhalten
Ich habe Verzeichnisse, nennen wir sie folder1
und folder2
. In jedem dieser Ordner sind Bilder benannt 1.jpg
, 2.jpg
und so weiter.
Leider Datei 1.jpg
in folder1
könnte ein anderes Bild als 1.jpg
in folder2
. Des Weiteren ist es möglich, die Datei 1.jpg
in folder1
das gleiche Bild wie 42.jpg
in 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?
3 Antworten auf die Frage
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
-n
Dies 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 )
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.
Verwandte Probleme
-
9
Was ist der Unterschied zwischen den Befehlen "su -s" und "sudo -s"?
-
4
Gutes freies Ubuntu Server-VMWare-Image benötigt
-
4
Was sind die Unterschiede zwischen den großen Linux-Distributionen? Werde ich es merken
-
2
Begrenzung der CPU-Auslastung für Flash in Firefox?
-
2
Wie kann ich mein Mikrofon unter Debian GNOME zum Laufen bringen?
-
2
Conky-Setups - Beispiele / Ideen?
-
3
Was sind die Unterschiede zwischen Linux Window Managern?
-
2
ThunderBird / Lichtsynchronisation mit SE k770i
-
4
Linux-Dateisystem
-
6
Vollbild-Flash langsam in KDE 4