In letzter Zeit muss ich viele Duplikate löschen. Ich füge drei oder vier Dateisysteme zusammen und möchte, dass der Speicherplatz wirtschaftlich genutzt wird. Zunächst fdupes
schien es das beste Werkzeug für den Job zu sein, aber ich stoße zunehmend auf Einschränkungen.
Betrachten Sie den Befehl fdupes -rdN somedirectory/
. Dadurch wird ein Hash aller Dateien in den Unterverzeichnissen eines Verzeichnisses erstellt.
Und wenn es auf Duplikate stößt, werden diese gelöscht, sodass nur eine Kopie von allem vorhanden ist.
Aber was ist, wenn ich es behalten möchte somedirectory/subdirectory1/somefile
und tatsächlich vier Duplikate vorhanden sind und das Programm zuerst auf eines der Duplikate stößt? Dann löscht es somedirectory/subdirectory1/somefile
, was ich nicht will.
Ich möchte in der Lage sein, irgendwie anzugeben, welche Duplikate aufbewahrt werden sollen. Und bisher scheint keines der Standardprogramme für den Umgang mit Duplikaten (Duff, FSLint) eine Automatisierung dieser Art von Verhalten zu ermöglichen. Ich würde es vorziehen, nicht meine eigene Rolle zu spielen, deshalb stelle ich diese Frage.
Ich würde gerne in der Lage sein, so etwas zu schreiben
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
quelle
Antworten:
Obwohl die von Ihnen gesuchte Funktionalität nicht auf Lager verfügbar ist
fdupes
, habe ich nachgegebenfdupes
(meine Gabel heißtjdupes
) und einige Funktionen hinzugefügt, die dieses Problem unter bestimmten Umständen lösen können. In dem angegebenen Fall, in dem Sie beispielsweisesomedirectory/subdirectory1/somefile
beim automatischen Löschen von Duplikaten (dasd
undN
wechselt zusammen) beibehalten möchten und sich keine separaten Dateien unmittelbar darunter befindensomedirectory
,jdupes
können Sie jedem direkten Unterverzeichnispfadsubdirectory1
zuerst und dem-O
Schalter (der die Dateien nach Befehlen sortiert) einen Eintrag zuweisen Parameterreihenfolge zuerst):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Dies löscht automatisch alle bis auf eine Datei in einem doppelten Satz und
somedirectory/subdirectory1
stellt sicher, dass, wenn der Satz eine Datei enthält , diese die erste ist, wodurch sie automatisch zur konservierten Datei im Satz wird. Es gibt immer noch krasse Grenzen für diesen Ansatz, zum Beispiel die Tatsache, dass ein anderes Duplikatsomedirectory/subdirectory1
anstelle des von Ihnen gewünschten beibehalten werden kann, aber in einer guten Anzahl von Fällen wie Ihrem ist diejdupes
Option für die Parameterreihenfolge als Workaround ausreichend.In naher Zukunft plane ich, ein Filtersystem hinzuzufügen
jdupes
, das eine enorme Kontrolle über das Einschließen / Ausschließen von Dateien, die Aufbewahrung von-N
Aktionen und die Anwendung solcher "Filterstapel" auf globaler oder parameterbezogener Basis ermöglicht. Diese Funktion wird dringend benötigt. Ich stelle mir so etwas wie "Nicht-Null-Duplikate rekursiv automatisch löschen, ABER immer so aufbewahren,somedirectory/subdirectory1/somefile
wie sie sind" vor:jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
quelle
Was ist mit dem Zusammenfügen der doppelten Dateien? Auf diese Weise wird der Raum nur einmal verwendet, aber sie existieren immer noch in allen Pfaden. Der Haken dabei ist, dass fest verknüpfte Dateien an Ort und Stelle geändert werden sollten (sie sollten nur geändert werden, indem die Datei gelöscht und mit dem neuen Inhalt neu erstellt wird). Der andere Ansatz besteht darin, die Dateien miteinander zu verknüpfen, obwohl Sie die gleiche Frage haben, welche die "primäre" Datei ist. Dies könnte mit dem folgenden Skript geschehen (obwohl dies keine Dateinamen behandelt, die Leerzeichen enthalten).
quelle
jdupes
stattfdupes
Sie können einfach gehen,jdupes -nrL somedirectory/
was massiv schneller ist.Ich habe das nirgendwo anders gesehen: Sagen Sie, was Sie wollen, ist das. Sie haben / mnt / folder-tree-1 / mnt / folder-tree-2. Sie möchten nicht jedes Duplikat entfernen, aber wenn in Baum-2 eine Datei vorhanden ist und in Baum-1 eine identische Datei mit genau demselben Pfad und Namen vorhanden ist, entfernen Sie sie aus Baum-2.
Achtung: Dies ist ziemlich knapp und wenn Sie versuchen, dies mit eingeschränkten Shell-Fähigkeiten zu kopieren und einzufügen, seien Sie vorsichtig.
Oder alles in einer Zeile:
Überprüfen Sie anschließend die Datei rm-v2-dupes.sh und führen Sie sie aus
quelle
Ich hatte die gleiche frage Wenn Sie viele Duplikate haben, wird
fdupes /my/directory/ -rdN
die Datei mit dem ältesten Änderungsdatum beibehalten, oder wenn mehrere Dateien das gleiche Änderungsdatum haben, wird die zuerst gefunden.Wenn das Änderungsdatum für Sie nicht wichtig ist, können Sie
touch
die Dateien in dem Verzeichnis speichern, das Sie behalten möchten. Wenn Sietouch
sie mit dem aktuellen Datum und der aktuellen Uhrzeit auswählen,fdupes -rdNi
werden diejenigen mit dem aktuellen Datum beibehalten. Oder Sie könnentouch
Dateien mit einem früheren Datum als dem der zu löschenden behalten undfdupes -rdN
wie gewohnt verwenden.Wenn Sie das Änderungsdatum beibehalten müssen, müssen Sie eine der anderen Methoden anwenden.
quelle
Nur um einer vorherigen Antwort eine Wendung hinzuzufügen. Ich habe den folgenden Code mehrmals verwendet und eine vorherige Antwort durch einfaches
| grep
Isolieren des Ordners, aus dem ich löschen möchte , leicht geändert .Auch hier wird eine sh-Datei erstellt, in der alle aufgelisteten Dateien ohne kommentierte Zeilen gelöscht werden. Natürlich können Sie die Datei auch weiterhin bearbeiten, um bestimmte Zeilen / Dateien, die Sie behalten möchten, zu kommentieren.
Ein weiterer Hinweis für große Verzeichnisse ist, fdupes in eine txt-Datei auszuführen und dann mit
| grep
und zu experimentieren,| sed
bis das gewünschte Ergebnis vorliegt .quelle
Verwenden Sie
sed
diese Option , um eine Shell-Datei zu erstellen, die auskommentierte Befehle zum Löschen jeder Ihrer doppelten Dateien enthält:In der
remove-duplicate-files.sh
soeben erstellten resultierenden Datei ist jede Zeile auskommentiert. Kommentieren Sie die zu löschenden Dateien aus. Dann laufsh remove-duplicate-files.sh
. Voila!AKTUALISIEREN
Wenn Sie Dateien nicht nur in bestimmten Verzeichnissen löschen möchten, ist dies so einfach :
Wo
exclude_duplicates.py
ist:In der
remove-duplicate-files-keep-protected.sh
soeben erstellten resultierenden Datei sind alle Dateien aus geschützten Verzeichnissen auskommentiert. Öffnen Sie diese Datei in Ihrem bevorzugten Texteditor und überprüfen Sie, ob alles in Ordnung ist. Führen Sie es dann aus. Voila!quelle
Was ist mit so etwas?
quelle