Wie ersetze ich alle doppelten Dateien durch feste Links?

20

Ich habe zwei Ordner mit verschiedenen Dateien. Einige Dateien aus dem ersten Ordner haben eine exakte Kopie im zweiten Ordner. Ich möchte diese durch einen festen Link ersetzen. Wie kann ich das machen?

qdii
quelle
2
Bitte geben Sie das Betriebssystem und das Dateisystem an.
Steven
Nun, ich verwende ext4 unter Ubuntu 15.04, aber wenn jemand eine Antwort für ein anderes Betriebssystem liefert, kann dies sicherlich hilfreich sein, wenn jemand diese Frage liest.
QDII
Hier ist eine doppelte Frage auf Unix.SE .
Alexey

Antworten:

20

Ich kenne 4 Kommandozeilenlösungen für Linux. Mein bevorzugter ist der letzte, der hier aufgelistet ist rdfind, da alle verfügbaren Optionen vorhanden sind.

fdupes

  • Dies scheint die am meisten empfohlene / bekannteste zu sein.
  • Es ist am einfachsten zu benutzen, aber seine einzige Aktion ist das Löschen von Duplikaten.
  • Um sicherzustellen, dass es sich bei Duplikaten tatsächlich um Duplikate handelt (wobei die Ausführung nicht ewig dauert), werden Vergleiche zwischen Dateien zunächst nach Dateigröße, dann nach MD5-Hash und dann nach byteweisem Vergleich durchgeführt.

Beispielausgabe (mit den Optionen "Größe anzeigen", "rekursiv"):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

Hardlink

  • Entwickelt, um, wie der Name schon sagt, gefundene Dateien durch Hardlinks zu ersetzen.
  • Hat eine --dry-runOption.
  • Gibt nicht an, wie Inhalte verglichen werden, berücksichtigt jedoch im Gegensatz zu allen anderen Optionen Dateimodus, Eigentümer und Änderungszeit.

Beispielausgabe (beachten Sie, dass meine beiden Dateien geringfügig unterschiedliche Änderungszeiten haben, sodass ich sie im zweiten Durchgang anweise, dies zu ignorieren):

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

duff

  • Erstellt, um Dateien zu finden, auf die der Benutzer dann reagiert. hat keine verfügbaren Aktionen.
  • Die Vergleiche werden nach Dateigröße und dann nach sha1-Hash durchgeführt.
    • Hash kann in sha256, sha384 oder sha512 geändert werden.
    • Hash kann deaktiviert werden, um einen byteweisen Vergleich durchzuführen

Beispielausgabe (mit Option "rekursiv"):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • Optionen haben eine ungewöhnliche Syntax (soll nachahmen find?).
  • Mehrere Optionen für Aktionen, um doppelte Dateien zu bearbeiten (Löschen, Symlinks erstellen, Hardlinks erstellen).
  • Hat einen Trockenlaufmodus.
  • Die Vergleiche werden nach Dateigröße, dann nach Erstbyte, dann nach Letztbyte und dann entweder nach md5 (Standard) oder sha1 durchgeführt.
  • Durch die Rangfolge der gefundenen Dateien ist vorhersehbar, welche Datei als Original angesehen wird.

Beispielausgabe:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file
Izkata
quelle
1
"dann entweder md5 (default) oder sha1." Das heißt nicht, dass die Dateien identisch sind. Da für die Berechnung eines Hashs das Programm ohnehin die gesamte Datei lesen muss, sollte es nur die gesamten Dateien Byte für Byte vergleichen. Spart auch CPU-Zeit.
Endolith
@ Endolith Das ist, warum Sie immer mit Trockenlauf beginnen, um zu sehen, was passieren würde ...
Izkata
1
Das Ziel der Software ist es jedoch, doppelte Dateien für Sie zu identifizieren. Wenn Sie manuell überprüfen müssen, ob die Dateien tatsächlich doppelt vorhanden sind, ist dies nicht sinnvoll.
Endolith
2
Wenn Sie n Dateien mit identischer Größe, Anfangsbyte und Endbyte haben, diese aber alle unterschiedlich sind, erfordert dies n ! Paarvergleiche. Das Hashing aller Daten und das Vergleichen von Hashes ist wahrscheinlich viel schneller, insbesondere bei großen Dateien und / oder einer großen Anzahl von Dateien. Jeder, der diesen Filter besteht, kann direkte Vergleiche durchführen, um dies zu überprüfen. (Oder verwenden Sie einfach einen besseren Hash.)
Alan De Smet
6

Duplicate Commander ist eine mögliche Lösung unter Windows:

Duplicate Commander ist eine Freeware-Anwendung, mit der Sie doppelte Dateien auf Ihrem PC finden und verwalten können. Duplicate Commander verfügt über zahlreiche Funktionen und Tools, mit denen Sie Ihren Speicherplatz aus diesen Duplikaten wiederherstellen können.

Eigenschaften:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

Für Linux können Sie ein Bash - Skript finden hier .

Karan
quelle
2

Duplicate & Same File Searcher ist eine weitere Lösung unter Windows:

Duplicate & Same Files Searcher (Duplicate Searcher) ist eine Anwendung zum Suchen von doppelten Dateien (Klonen) und NTFS-Hardlinks zu derselben Datei. Unabhängig vom Dateinamen werden doppelte Dateiinhalte durchsucht (es wird ein echter Byte-zu-Byte-Vergleich verwendet). Mit dieser Anwendung können nicht nur doppelte Dateien gelöscht oder an einen anderen Speicherort verschoben werden, sondern auch doppelte Dateien durch feste NTFS-Links ersetzt werden (einzigartig!).

Bildbeschreibung hier eingeben

Greck
quelle
1

Ich hatte ein raffiniertes kostenloses Tool auf meinem Computer namens Link Shell Extension. Es war nicht nur großartig, um harte Links und symbolische Links zu erstellen, sondern auch Junctions! Darüber hinaus wurden benutzerdefinierte Symbole hinzugefügt, mit denen Sie auf einfache Weise verschiedene Arten von Links identifizieren können, auch solche, die bereits vor der Installation vorhanden waren. Rote Pfeile stehen beispielsweise für harte Links, während grüne für symbolische Links und Ketten für Kreuzungen stehen.

Ich habe die Software leider vor einiger Zeit deinstalliert (bei einer Massen-Deinstallation verschiedener Programme), daher kann ich keine Links mehr manuell erstellen, aber die Symbole werden immer dann automatisch angezeigt, wenn Windows einen Hard-, Symbolic- oder Junction-Link erkennt.

Amaroq Starwind
quelle
1

Ich kann jdupes nur empfehlen . Es ist eine erweiterte Gabelung von fdupes , enthält aber auch:

  • eine Reihe neuer Befehlszeilenoptionen - einschließlich --linkhard, oder -Lkurz gesagt
  • native Unterstützung für alle gängigen Betriebssysteme
  • Die Geschwindigkeit soll im Durchschnitt über 7-mal so hoch sein wie die von fdupes

Für Ihre Frage können Sie einfach ausführen $ jdupes -L /path/to/your/files.

Möglicherweise möchten Sie die neueste Quelle von ihrem GitHub-Repo klonen und erstellen, da sich das Projekt noch in der aktiven Entwicklung befindet. Hier werden auch Windows-Binärdateien bereitgestellt. Gepackte Binärdateien sind in einigen Linux / BSD-Distributionen verfügbar - eigentlich habe ich sie zum ersten Mal gefunden $ apt search.

Arnie97
quelle