Gibt es eine einfache Möglichkeit, doppelte Dateien durch Hardlinks zu ersetzen?

136

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.

Josh
quelle
20
Ein Problem, auf das Sie bei Hardlinks stoßen können, besteht darin, dass jemand, der beschließt, mit einer seiner Musikdateien, die Sie fest verlinkt haben, etwas zu tun, den Zugriff anderer Leute auf ihre Musik möglicherweise versehentlich beeinträchtigt.
Steven D
4
Ein weiteres Problem ist, dass zwei verschiedene Dateien, die "Some Really Great Tune" enthalten, selbst wenn sie mit demselben Encoder aus derselben Quelle stammen, höchstwahrscheinlich nicht bitweise identisch sind.
msw
3
Besser wäre es, einen öffentlichen Musikordner zu haben ...
Stefan
1
@tante: Die Verwendung von Symlinks löst kein Problem. Wenn ein Benutzer eine Datei "löscht", wird die Anzahl der Verknüpfungen verringert. Wenn die Anzahl Null erreicht, werden die Dateien wirklich gelöscht. Das ist alles. Das Löschen ist mit fest verknüpften Dateien also kein Problem. Das einzige Problem ist, dass ein Benutzer versucht, die Datei zu bearbeiten (in der Tat unwahrscheinlich) oder zu überschreiben (durchaus möglich, wenn er angemeldet ist).
Maaartinus

Antworten:

41

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:

Durchsuchen Sie alle in der Befehlszeile genannten Verzeichnisse, berechnen Sie MD5-Prüfsummen und suchen Sie nach Dateien mit identischem MD5. Wenn sie gleich sind, führen Sie einen echten Vergleich durch, wenn sie wirklich gleich sind. Ersetzen Sie die zweite von zwei Dateien durch einen festen Link zur ersten.

fschmitt
quelle
Klingt perfekt , danke !! Ich werde es versuchen und akzeptieren, wenn es wie beschrieben funktioniert!
Josh
3
Das hat genau das getan, wonach ich gefragt habe. Ich glaube jedoch, dass ZFS mit dedup der richtige Weg sein wird, da ich festgestellt habe, dass die Dateien geringfügige Unterschiede aufweisen, sodass nur wenige fest miteinander verknüpft werden können.
Josh
11
Ich habe das positiv bewertet, aber nachdem ich ein paar weitere Nachforschungen angestellt habe, habe ich das nicht getan. rdfindist ü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.
Oligofren
@oligofren Ich dachte das gleiche, aber dann habe ich getroffen [Errno 31] Too many links. Dies scheint das einzige zu sein, was damit fertig wird.
Phunehehe
5
Das Überprüfen jeder einzelnen Datei und nicht nur von Dateien, bei denen mindestens eine Datei mit identischer Größe vorhanden ist, ist unnötig ineffizient (und ist unnötig anfällig für Hash-Kollisionen).
Charles Duffy
85

rdfindtut 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önnen symlinksSie 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: timeAuf einem 15-GB-Ordner mit 2600 Dateien auf meinem Mac Mini aus dem Jahr 2009 wird dies zurückgegeben

9.99s user 3.61s system 66% cpu 20.543 total

(mit md5).

Verfügbar in den meisten Paket-Handlern (zB MacPorts für Mac OS X).

db
quelle
11
+1 Ich rdfindhabe es benutzt und geliebt. Es gibt eine -dryrun trueOption, 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.
Daniel Trebbien
Oh, schön. Früher habe ich fdupes verwendet, aber die Option -L zum Verknüpfen von Dupes fehlt in Ubuntu 14.10. War ziemlich langsam und gab es für Homebrew unter OSX nicht, daher ist diese Antwort viel besser. Vielen Dank!
Oligofren
Sehr intelligenter und schneller Algorithmus.
Ndemou
2
Ich vermute, die Leistung dieses Tools hat mehr mit dem Algorithmus selbst zu tun und weniger damit, ob es sich um ein kompiliertes Tool oder ein Skript handelt. Für diese Art von Operation wird die Festplatte fast immer der Engpass sein. Solange skriptbasierte Tools sicherstellen, dass eine asynchrone E / A-Operation ausgeführt wird, während die CPU auf Prüfsummen gebrannt wird, sollten sie ungefähr so ​​gut wie eine native Binärdatei funktionieren.
cdhowie
rdfind ist sehr abhängig von neuem Betriebssystem und Compiler. (Läuft nicht unter CentOS 6.x ohne eine fast vollständige Neuerstellung der Entwicklungstools)
Cosmo F
49

Verwenden Sie das fdupesTool:

fdupes -r /path/to/foldergibt 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.

tante
quelle
1
Ubuntu Hinweis: Seit September 2013 gibt es keine stabile Version (Version 1.50-PR2-3). Das Update wird daher noch nicht in Ubuntu veröffentlicht.
Stuart Axon
11
Ich habe gerade versucht, fdupes_1.50-PR2-4 auf Ubuntu und Debian zu installieren. Zum Glück war es super einfach, von github.com/tobiasschulz/fdupes aus zu bauen .
Neu242
3
Versuchen Sie rdfind- wie fdupes, aber schneller und auf OS X und Cygwin auch.
Oligofren
6
fdupesscheint nur Duplikate zu finden, nicht durch Hardlinks zu ersetzen, also keine Antwort auf die Frage IMO.
Calimo
2
Es gibt ein ähnliches Tool namens 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 ( -Bfalls Sie btrfs verwenden).
Marius Gedminas
23

Ich benutze hardlinkvon http://jak-linux.org/projects/hardlink/

Waltinator
quelle
1
Netter Hinweis, ich verwende regelmäßig code.google.com/p/hardlinkpy, aber dies wurde für eine Weile nicht aktualisiert ...
meduz
2
Dies scheint dem Original hardlinkunter Fedora / RHEL / etc. Ähnlich zu sein .
1
hardlinkist 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).
Marcel Waldvogel
FWIW, das obige hardlinkwurde von Julian Andres Klode erstellt, während das Fedora hardlinkvon Jakub Jelinek erstellt wurde (Quelle: pagure.io/hardlink - Fedora-Paketname : hardlink )
maxschlepzig
18

Dies ist eine der Funktionen von "fslint" - http://en.flossmanuals.net/FSlint/Introduction

Klicken Sie auf die Schaltfläche "Zusammenführen":

Bildschirmfoto

Flimm
quelle
4
Das -m wird Duplikate miteinander verknüpfen, -d wird alle bis auf einen löschen, und -t wird trocken laufen und drucken, was es tun würde
Azendale
1
Unter Ubuntu ist sudo apt-get install fslint /usr/share/fslint/fslint/findup -m /your/directory/treeFolgendes zu tun: (Verzeichnis / usr / share / fslint / fslint / ist standardmäßig nicht in $ PATH enthalten)
Jocelyn
14

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.

Wei-Yin
quelle
Dies ist wahrscheinlich der Weg, den ich irgendwann gehen werde. Wird die ZFS-Implementierung von BSD jedoch dedupiert? Ich dachte, dass es nicht tat.
Josh
Darüber hinaus unterstützt das HAMMER-Dateisystem unter DragonFlyBSD die Deduplizierung.
Haamu
14
ZFS Dedup ist der Freund von niemandem. Wenn ZFS 1 GB RAM pro 1 TB nutzbaren Speicherplatz empfiehlt, sind Sie völlig verrückt, wenn Sie versuchen, dedup mit weniger als 32 GB RAM pro 1 TB nutzbarem Speicherplatz zu verwenden. Das bedeutet, dass bei einem 1-TB-Spiegel, wenn Sie keinen 32-GB-RAM haben, früher oder später wahrscheinlich Speicherbombenbedingungen auftreten, die den Computer aufgrund des Mangels an RAM zum Stillstand bringen. War dort, habe das getan und erholte sich immer noch von der PTBS.
Killermist
4
Um die übermäßigen RAM-Anforderungen bei der Online-Deduplizierung zu vermeiden (dh bei jedem Schreibvorgang überprüfen), btrfsverwenden 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/Deduplication
Marcel Waldvogel
3
Sieben Jahre später aktualisieren: Ich bin schließlich zu ZFS gewechselt und habe versucht, die Deduplizierung durchzuführen. Dabei stellte ich fest, dass die RAM-Anforderungen tatsächlich viel zu hoch waren. Die clevere Verwendung von ZFS-Snapshots lieferte die Lösung, die ich letztendlich verwendete. (Kopieren Sie die Musik eines Benutzers, einen Schnappschuss und einen Klon, und kopieren Sie die Musik des zweiten Benutzers in den Klon, rsync --inplacesodass nur geänderte Blöcke gespeichert werden.)
Josh,
7

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.

Matthew Bloch
quelle
1
Hintergrundinformationen und weitere Informationen finden Sie auf btrfs.wiki.kernel.org/index.php/Deduplication (einschließlich Verweis auf cp --reflink, siehe auch unten)
Marcel Waldvogel
5

Um doppelte Dateien zu finden, können Sie Duff verwenden .

Duff ist ein Unix-Befehlszeilenprogramm zum schnellen Auffinden von Duplikaten in einem bestimmten Satz von Dateien.

Einfach ausführen:

duff -r target-folder

Um automatisch Hardlinks zu diesen Dateien zu erstellen, müssen Sie die Ausgabe von duff mit bash oder einer anderen Skriptsprache analysieren .

Stefan
quelle
Wirklich langsam - siehe rdfind.pauldreik.se/#g0.6
ndemou
5
aptitude show hardlink

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/

Julien Palard
quelle
Das einzige hier erwähnte Programm für Gentoo ohne Demaskierung und mit Hardlink-Unterstützung, danke!
Jorrit Schippers
4

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:

   --reflink[=WHEN]
          control clone/CoW copies. See below

       When  --reflink[=always]  is specified, perform a lightweight copy, where the 
data blocks are copied only when modified.  If this is not possible the
       copy fails, or if --reflink=auto is specified, fall back to a standard copy.
Marcos
quelle
Ich denke, ich werde meinen cpAlias so aktualisieren, dass er --reflink=autojetzt immer den Parameter enthält
Marcos
1
Unterstützt ext4 wirklich --reflink?
7
Dies wird unter btrfs und OCFS2 unterstützt. Es ist nur auf Copy-on-Write-Dateisystemen möglich, nicht auf ext4. btrfs entwickelt sich wirklich. Ich liebe es, es zu verwenden, weil es sich um einen Rückblick und Schnappschüsse handelt, und Sie haben weniger Angst davor, Massenoperationen an großen Dateibäumen durchzuführen.
Clacke
3

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:

  • Dateiname
  • Größe
  • md5 prüfsumme
  • Byte-Inhalt

Tun irgendwelche Methoden dies? Schauen Sie sich duff, fdupes, rmlint, fslintetc.

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?

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | \
  xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | \
  sort | uniq -w32 --all-repeated=separate
Johny, warum?
quelle
3
Ich habe verwendet duff, fdupesund rmlint, 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.
dubiousjim
3
In meiner Praxis ist der Dateiname der am wenigsten verlässliche Faktor, und ich habe ihn von jeglichen Bemühungen, die ich unternehme, um ein De-Duping, entfernt. Wie viele install.shDateien 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.
Gypsy Spellweaver
@GypsySpellweaver: (1) hängt vom persönlichen Anwendungsfall ab, stimmst du nicht zu? In meinem Fall habe ich mehrere Wiederherstellungen von mehreren Sicherungen, wobei Dateien mit demselben Namen und Inhalt in verschiedenen Wiederherstellungsordnern vorhanden sind. (2) In Ihrem Kommentar wird anscheinend nur der Dateiname verglichen . Ich schlug nicht vor, andere Kontrollen zu streichen.
Johny, warum
2

Da ich kein Perl-Fan bin, gibt es hier eine Bash-Version:

#!/bin/bash

DIR="/path/to/big/files"

find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo ln -f "$OLDFILE" "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done

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.

heiter
quelle
Wie kann ich Ihr Skript so ändern, dass es statt einer festen Verknüpfung nur die doppelten Dateien löscht und einer CSV-Datei einen Eintrag für die gelöschte Datei hinzufügt -> Linierte Datei. . ???
MR.GEWA
Sicher. Die Hardlink-Zeile: echo ln -f "$ OLDFILE" "$ NEWFILE" Ersetzt einfach die duplizierte Datei durch einen Hardlink, sodass Sie sie stattdessen in $ NEWFILE ändern können.
Seren
und wie schreibt man in der nächsten Zeile in irgendeiner Textdatei irgendwie $ OLDFILE-> NEWFILE ???
MR.GEWA
Ahh, richtig. Ja, fügen Sie nach dem rm eine Zeile hinzu, z. B .: echo "$ NEWFILE" >> /var/log/deleted_duplicate_files.log
seren
2
Erfinde das Rad nicht neu. Es gibt ausgereiftere Lösungen rdfind, die mit nativen Geschwindigkeiten funktionieren und nur die Installation brew install rdfindoder apt-get install rdfindInstallation erfordern .
Oligofren
1

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.

Amphetamachine
quelle
2
Ich hoffe, es bald zu versuchen ... warum nicht auf CPAN hochladen ... App :: relink oder so
Xenoterracide
2
@xenoterracide: wegen all der ähnlichen und ausgereiften Lösungen, die es bereits gibt. siehe die anderen antworten, insbesondere rdfind.
Oligofren
1
@oligofren Ich bezweifle nicht, dass es bessere Lösungen gibt. TMTOWTDI, denke ich.
Amphetamachine
1

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

Islam
quelle
3
Können Sie erläutern, wie „schlau“ es ist?
Stéphane Gimenez
1
Wie kann ich Dateien aus zwei verschiedenen Verzeichnissen vergleichen?
Burcardo
1

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

Jorge HB Sampaio Jr
quelle
Es hängt 1 TB fast volle ext3-Festplatte scannen, bringt das gesamte System zu einem Crawl. Abgebrochen nach 14 Stunden "Suchen"
Angsuman Chakraborty
1

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):

jdupes -rL /foo/bar
Skippy le Grand Gourou
quelle
0

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 :)

Znik
quelle
1
Ich mag den Offline- (oder Batch- ) Deduplizierungsansatz btrfs. Hervorragende Diskussion der Optionen (einschließlich der cp --reflinkOption) hier: btrfs.wiki.kernel.org/index.php/Deduplication
Marcel Waldvogel
ZFS ist nicht nur Solaris oder OpenSolaris. Es wird nativ von FreeBSD unterstützt. Auch ZFS auf Linux ist Gerätetreiber basiert; ZFS in FUSE ist etwas anderes.
KJ Seefried
0

Harte 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.

Amaroq Starwind
quelle
0

Am einfachsten ist es, das Spezialprogramm dupeGuru zu verwenden

dupeGuru Einstellungen Screenshot

wie die Dokumentation sagt

Löschoptionen

Diese Optionen wirken sich auf das Löschen von Duplikaten aus. In den meisten Fällen müssen Sie keine von ihnen aktivieren.

Gelöschte Dateien verlinken:

Die gelöschten Dateien werden durch einen Link zur Referenzdatei ersetzt. Sie haben die Wahl, es entweder durch einen Symlink oder einen Hardlink zu ersetzen. ... Ein Symlink ist eine Verknüpfung zum Dateipfad. Wenn die Originaldatei gelöscht oder verschoben wird, ist die Verknüpfung unterbrochen. Ein Hardlink ist ein Link zur Datei selbst. Dieser Link ist so gut wie eine "echte" Datei. Nur wenn alle Hardlinks zu einer Datei gelöscht sind, wird die Datei selbst gelöscht.

Unter OSX und Linux wird diese Funktion vollständig unterstützt, unter Windows ist sie jedoch etwas kompliziert. Windows XP unterstützt es nicht, aber Vista und höher unterstützen es. Damit die Funktion jedoch funktioniert, muss dupeGuru mit Administratorrechten ausgeführt werden.

Russischer Junior Ruby Entwickler
quelle