Ich suche nach einer einfachen Möglichkeit (einem Befehl oder einer Reihe von Befehlen, die wahrscheinlich einschließen find
), um doppelte Dateien in zwei Verzeichnissen zu finden und die Dateien in einem Verzeichnis durch Hardlinks der Dateien im anderen Verzeichnis zu ersetzen.
Hier ist die Situation: Dies ist ein Dateiserver, auf dem mehrere Personen Audiodateien speichern, wobei jeder Benutzer einen eigenen Ordner hat. Manchmal haben mehrere Personen Kopien der exakt gleichen Audiodateien. Im Moment sind dies Duplikate. Ich würde es gerne so machen, dass sie Hardlinks sind, um Festplattenspeicher zu sparen.
Antworten:
Es gibt ein Perl-Skript unter http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl, das genau das tut, was Sie wollen:
quelle
rdfind
ist über die Paketmanager für ALLE wichtigen Plattformen (OS X, Linux, (Cyg) Win, Solaris) verfügbar und arbeitet mit einer rasanten nativen Geschwindigkeit. Schauen Sie sich also die Antwort unten an.[Errno 31] Too many links
. Dies scheint das einzige zu sein, was damit fertig wird.rdfind
tut genau das, wonach du fragst (und in der Reihenfolge, in der johny warum auflistet). Ermöglicht das Löschen von Duplikaten und deren Ersetzung durch weiche oder harte Links. In Kombination mit könnensymlinks
Sie den Symlink auch absolut oder relativ machen. Sie können sogar einen Prüfsummenalgorithmus auswählen (md5 oder sha1).Da es kompiliert ist, ist es schneller als die meisten skriptbasierten Lösungen:
time
Auf einem 15-GB-Ordner mit 2600 Dateien auf meinem Mac Mini aus dem Jahr 2009 wird dies zurückgegeben(mit md5).
Verfügbar in den meisten Paket-Handlern (zB MacPorts für Mac OS X).
quelle
rdfind
habe es benutzt und geliebt. Es gibt eine-dryrun true
Option, mit der Sie wissen, was es getan hätte. Das Ersetzen von Duplikaten durch feste Links ist so einfach wie-makehardlinks true
. Es hat ein schönes Protokoll erstellt und mich darüber informiert, wie viel Speicherplatz freigegeben wurde. Außerdem ist rdfind laut Benchmark des Autors schneller als Duff und Fslint.Verwenden Sie das
fdupes
Tool:fdupes -r /path/to/folder
gibt Ihnen eine Liste der Duplikate im Verzeichnis (-r macht es rekursiv). Die Ausgabe sieht folgendermaßen aus:Dateiname1
Dateiname2
Dateiname3
Dateiname4
Dateiname5
wobei filename1 und filename2 identisch sind und filename3, filename4 und filename5 ebenfalls identisch sind.
quelle
rdfind
- wiefdupes
, aber schneller und auf OS X und Cygwin auch.fdupes
scheint nur Duplikate zu finden, nicht durch Hardlinks zu ersetzen, also keine Antwort auf die Frage IMO.jdupes
"Basiert auf"fdupes
, aber es kann auch die doppelten Dateien durch symlinks (-l
), hardlinks (-L
) ersetzen oder btrfs anweisen, die Blöcke auf Dateisystemebene zu deduplizieren (-B
falls Sie btrfs verwenden).Ich benutze
hardlink
von http://jak-linux.org/projects/hardlink/quelle
hardlink
unter Fedora / RHEL / etc. Ähnlich zu sein .hardlink
ist jetzt eine native Binärdatei in vielen Linux-Paketsystemen (seit ~ 2014) und extrem schnell. Bei 1,2M-Dateien (320 GB) dauerte es nur 200 Sekunden (etwa 10% der Dateien werden verknüpft).hardlink
wurde von Julian Andres Klode erstellt, während das Fedorahardlink
von Jakub Jelinek erstellt wurde (Quelle: pagure.io/hardlink - Fedora-Paketname : hardlink )Dies ist eine der Funktionen von "fslint" - http://en.flossmanuals.net/FSlint/Introduction
Klicken Sie auf die Schaltfläche "Zusammenführen":
quelle
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
Folgendes zu tun: (Verzeichnis / usr / share / fslint / fslint / ist standardmäßig nicht in $ PATH enthalten)Da Ihr Hauptziel darin besteht, Speicherplatz zu sparen, gibt es eine andere Lösung: Deduplizierung (und wahrscheinlich Komprimierung) auf Dateisystemebene. Verglichen mit der Hardlink-Lösung hat es nicht das Problem, versehentlich andere verknüpfte Dateien zu beeinflussen.
ZFS hat seit Pool-Version 23 Dedup (Block-Level, nicht File-Level) und seit langer Zeit Komprimierung. Wenn Sie Linux verwenden, können Sie zfs-fuse ausprobieren , oder wenn Sie BSD verwenden, wird es nativ unterstützt.
quelle
btrfs
verwenden Sie die Batch- oder Offline- Deduplizierung (führen Sie sie aus, wann immer Sie sie für nützlich / erforderlich halten). Btrfs.wiki.kernel.org/index.php/Deduplicationrsync --inplace
sodass nur geänderte Blöcke gespeichert werden.)Unter modernen Linux-Betriebssystemen gibt es heutzutage https://github.com/g2p/bedup, das Deduplizierungen auf einem btrfs-Dateisystem vornimmt, aber 1) ohne den Scan-Aufwand, 2) Dateien können danach leicht wieder auseinander gehen.
quelle
cp --reflink
, siehe auch unten)Um doppelte Dateien zu finden, können Sie Duff verwenden .
Einfach ausführen:
Um automatisch Hardlinks zu diesen Dateien zu erstellen, müssen Sie die Ausgabe von duff mit bash oder einer anderen Skriptsprache analysieren .
quelle
Beschreibung: Verknüpft mehrere Kopien derselben Datei. Hardlink ist ein Tool, das mehrere Kopien derselben Datei erkennt und durch Hardlinks ersetzt.
Die Idee wurde von http://code.google.com/p/hardlinkpy/ übernommen , aber der Code wurde von Grund auf neu geschrieben und unter der MIT-Lizenz lizenziert. Homepage: http://jak-linux.org/projects/hardlink/
quelle
Ich habe viele der hier erwähnten Hardlinking-Tools für Linux verwendet. Ich bin auch mit ext4 fs auf Ubuntu stecken geblieben und habe seine cp -l und -s für Hard / Softlinking verwendet. Kürzlich ist jedoch aufgefallen, dass in der Manpage von cp eine leichtgewichtige Kopie enthalten ist , die impliziert, dass redundanter Speicherplatz gespart wird, bis eine Seite geändert wird:
quelle
cp
Alias so aktualisieren, dass er--reflink=auto
jetzt immer den Parameter enthält--reflink
?Scheint mir, dass das Überprüfen des Dateinamens die Dinge beschleunigen könnte. Fehlen zwei Dateien mit demselben Dateinamen, würde ich sie in vielen Fällen nicht als Duplikate betrachten. Scheint, dass die schnellste Methode wäre zu vergleichen, um:
Tun irgendwelche Methoden dies? Schauen Sie sich
duff
,fdupes
,rmlint
,fslint
etc.Die folgende Methode wurde auf commandlinefu.com am häufigsten gewählt : Doppelte Dateien suchen (zuerst nach Größe, dann nach MD5-Hash)
Kann der Dateinamenvergleich als erster Schritt hinzugefügt werden, die Größe als zweiter Schritt?
quelle
duff
,fdupes
undrmlint
, und Lesern wird dringend empfohlen, betrachten das Drittel davon . Es verfügt über ein ausgezeichnetes Optionsset (und Dokumentation). Dadurch konnte ich einen Großteil der Nachbearbeitung vermeiden, die ich für die anderen Tools benötigte.install.sh
Dateien befinden sich auf einem aktiven System? Ich kann nicht zählen, wie oft ich eine Datei gespeichert habe und dabei ein Namenskonflikt aufgetreten ist. Einige Dateien wurden sofort umbenannt, um sie zu speichern. Kehrseite: Keine Ahnung, wie oft ich an verschiedenen Tagen etwas aus verschiedenen Quellen heruntergeladen habe, nur um festzustellen, dass es sich um dieselbe Datei mit unterschiedlichen Namen handelt. (Dies beeinträchtigt auch die Zuverlässigkeit des Zeitstempels.) 1: Größe, 2: Digest, 3: Byte-Inhalt.Da ich kein Perl-Fan bin, gibt es hier eine Bash-Version:
Dadurch werden alle Dateien mit derselben Prüfsumme (ob groß, klein oder bereits fest verknüpft) gefunden und miteinander verknüpft.
Dies kann für wiederholte Durchläufe mit zusätzlichen Suchflags (z. B. Größe) und einem Datei-Cache stark optimiert werden (damit Sie die Prüfsummen nicht jedes Mal wiederholen müssen). Wenn jemand an der intelligenteren, längeren Version interessiert ist, kann ich sie posten.
HINWEIS: Wie bereits erwähnt, funktionieren Hardlinks so lange, wie die Dateien nie geändert werden müssen oder zwischen Dateisystemen verschoben werden müssen.
quelle
rdfind
, die mit nativen Geschwindigkeiten funktionieren und nur die Installationbrew install rdfind
oderapt-get install rdfind
Installation erfordern .Ich habe ein Perl-Skript erstellt, das etwas ähnliches macht wie das, wovon Sie sprechen:
http://pastebin.com/U7mFHZU7
Grundsätzlich durchläuft es nur ein Verzeichnis, berechnet die SHA1-Summe der darin enthaltenen Dateien, hascht sie und verknüpft Übereinstimmungen miteinander. Es hat sich bei vielen Gelegenheiten als nützlich erwiesen.
quelle
Wenn Sie Duplikate auf einem Mac oder einem UNIX-basierten System durch Hard Links ersetzen möchten, können Sie versuchen, SmartDupe unter http://sourceforge.net/projects/smartdupe/ zu entwickeln
quelle
Die Anwendung FSLint ( http://www.pixelbeat.org/fslint/ ) kann alle gleichen Dateien in jedem Ordner (nach Inhalt) finden und Hardlinks erstellen. Versuche es!
Jorge Sampaio
quelle
jdupes
wurde in einem Kommentar erwähnt, verdient aber eine eigene Antwort, da es wahrscheinlich in den meisten Distributionen verfügbar ist und ziemlich schnell ausgeführt wird (es hat gerade 2,7 GB einer zu 98% vollen 158 GB-Partition (SSD-Laufwerk) in etwa einer Minute freigegeben):quelle
Wenn Sie Hardlinks erstellen, achten Sie auf die Rechte an dieser Datei. Hinweis, Eigentümer, Gruppe, Modus, erweiterte Attribute, Zeit und ACL (falls Sie dies verwenden) werden in INODE gespeichert. Nur Dateinamen unterscheiden sich, da diese in der Verzeichnisstruktur gespeichert sind und andere auf INODE-Eigenschaften verweisen. Aus diesem Grund haben alle Dateinamen, die mit demselben Inode verknüpft sind, dieselben Zugriffsrechte. Sie sollten verhindern, dass diese Datei geändert wird, da jeder Benutzer andere Dateien beschädigen kann. Es ist einfach. Es reicht aus, wenn ein Benutzer eine andere Datei mit demselben Namen erstellt. Die Inode-Nummer wird dann gespeichert, und der ursprüngliche Dateiinhalt wird für alle fest verknüpften Namen zerstört (ersetzt).
Besser ist die Deduplizierung auf Dateisystemebene. Sie können BTRFS (sehr beliebt beim letzten Mal), OCFS oder ähnliches verwenden. Schauen Sie sich die Seite an: https://en.wikipedia.org/wiki/Comparison_of_file_systems , speziell in der Tabelle Features und Deduplizierung von Spaltendaten. Sie können darauf klicken und sortieren :)
Betrachten Sie speziell das ZFS-Dateisystem. Dies ist als FUSE verfügbar, aber auf diese Weise ist es sehr langsam. Wenn Sie native Unterstützung wünschen, besuchen Sie die Seite http://zfsonlinux.org/ . Dann müssen Sie den Kernel patchen und als nächstes die zfs-Tools für die Verwaltung installieren. Ich verstehe nicht, warum Linux als Treiber nicht unterstützt, es ist übrigens für viele andere Betriebssysteme / Kernel.
Dateisysteme unterstützen die Deduplizierung auf zwei Arten, die Deduplizierung von Dateien oder Blöcken. ZFS unterstützt Block. Dies bedeutet, dass derselbe Inhalt, der sich in derselben Datei wiederholt, dedupliziert werden kann. Wenn Daten dedupliziert werden, kann dies auch online (zfs) oder offline (btrfs) sein.
Beachten Sie, dass die Deduplizierung RAM verbraucht. Aus diesem Grund führt das Schreiben von Dateien auf ein mit FUSE bereitgestelltes ZFS-Volume zu einer dramatisch langsamen Leistung. Dies ist in der Dokumentation beschrieben. Sie können die Deduplizierung jedoch online für die Lautstärke ein- und ausschalten. Wenn Sie feststellen, dass Daten dedupliziert werden sollten, müssen Sie nur die Deduplizierung aktivieren, einige Dateien in temporäre Dateien umschreiben und schließlich ersetzen. Danach können Sie die Deduplizierung deaktivieren und die volle Leistung wiederherstellen. Natürlich können Sie dem Speicher beliebige Cache-Festplatten hinzufügen. Dies können sehr schnell rotierende Festplatten oder SSD-Festplatten sein. Dies können natürlich sehr kleine Festplatten sein. In der realen Arbeit ist dies ein Ersatz für RAM :)
Unter Linux sollten Sie sich um ZFS kümmern, da nicht alle Funktionen ordnungsgemäß funktionieren. Dies gilt insbesondere für die Verwaltung des Dateisystems, die Erstellung von Snapshots usw. Wenn Sie jedoch eine Konfiguration vornehmen und diese nicht ändern, funktioniert alles ordnungsgemäß. Andernfalls sollten Sie Linux auf OpenSolaris umstellen, es unterstützt nativ ZFS :) Das Schöne an ZFS ist, dass es sowohl als Dateisystem als auch als Volume-Manager ähnlich wie LVM funktioniert. Sie benötigen es nicht, wenn Sie ZFS verwenden. Weitere Informationen finden Sie in der Dokumentation.
Beachten Sie den Unterschied zwischen ZFS und BTRFS. ZFS ist älter und ausgereifter, leider nur unter Solaris und OpenSolaris (leider von Oracle erwürgt). BTRFS ist jünger, aber letztes Mal sehr gut unterstützt. Ich empfehle frischen Kernel. ZFS verfügt über eine Online-Deduplizierung, die das Schreiben verlangsamt, da alles online berechnet wird. BTRFS unterstützt die Offline-Deduplizierung. Dies spart dann Leistung, aber wenn der Host nichts zu tun hat, führen Sie regelmäßig ein Tool aus, um die Deduplizierung durchzuführen. Und BTRFS wird nativ unter Linux erstellt. Vielleicht ist das bessere FS für dich :)
quelle
btrfs
. Hervorragende Diskussion der Optionen (einschließlich dercp --reflink
Option) hier: btrfs.wiki.kernel.org/index.php/DeduplicationHarte Links sind möglicherweise nicht die beste Idee. Wenn ein Benutzer die Datei ändert, wirkt sich dies auf beide aus. Durch das Löschen eines festen Links werden jedoch nicht beide Dateien gelöscht. Außerdem bin ich mir nicht ganz sicher, ob Hard Links den gleichen Speicherplatz (auf der Festplatte, nicht auf dem Betriebssystem) belegen wie mehrere Kopien derselben Datei. Laut Windows (mit der Link Shell Extension) tun sie dies. Zugegeben, das ist Windows, nicht Unix ...
Meine Lösung wäre, eine "gemeinsame" Datei in einem versteckten Ordner zu erstellen und die tatsächlichen Duplikate durch symbolische Links zu ersetzen. Dann würden die symbolischen Links mit Metadaten oder alternativen Dateistreams eingebettet, die jedoch nur die beiden "Dateien" aufzeichnen. unterscheiden sich voneinander, zum Beispiel, wenn eine Person den Dateinamen ändern oder ein benutzerdefiniertes Albumcover oder ähnliches hinzufügen möchte; Es kann sogar außerhalb von Datenbankanwendungen nützlich sein, z. B. wenn mehrere Versionen desselben Spiels oder derselben Software installiert sind und diese unabhängig voneinander getestet werden, selbst wenn die kleinsten Unterschiede bestehen.
quelle
Am einfachsten ist es, das Spezialprogramm dupeGuru zu verwenden
wie die Dokumentation sagt
quelle