Ich hatte Probleme mit meinem Backup und habe jetzt viele Ordner mehrfach auf meiner Festplatte. Ich habe einen Hauptordnerbaum, den ich so behalten möchte, wie er ist. Wie kann ich verhindern, dass fdupes Dateien in Verzeichnissen löscht, die ich nicht löschen möchte?
Gibt es vielleicht ein anderes Dienstprogramm zur Duplikatssuche?
Antwort1
Gibt es vielleicht ein anderes Dienstprogramm zur Duplikatssuche?
Verwendenrmlint, es macht genau das, was Sie wollen, indem Sie die Option --keep-all-tagged verwenden:
$ rmlint --types=duplicates --keep-all-tagged /path/to/dupes /other/path/to/dupes // main/folder/tree
Antwort2
Warum nicht den Prozess verlangsamen und etwas vorsichtiger sein?
Holen Sie sich den Vergleich der Duplikate fdupes
und speichern Sie ihn in einer Datei.
fdupes -r /path/to/start > filesToDelete
Anschließend können Sie in Ihrem eigenen Tempo alle Verzeichnisse oder Dateien entfernen, die Sie behalten möchten.filesToDelete
So entfernen Sie ganze Verzeichnisse
sed -i '|/directoryToKeep/|d' filesToDelete
Gehen Sie die Schritte filesToDelete
in Ihrem bevorzugten Texteditor durch und setzen Sie am Anfang der Kopie jeder Datei, die Sie kopieren möchten, ein Zeichen (vielleicht ein x?).haltenSo können Sie verfolgen, was Sie getan haben, und dann, wenn Sie sich der Änderungen sicher sind
cat aFile | xargs -d "\n" rm
rm
gibt bei jeder Zeile mit einem x (sowie bei jedem Kommentar oder anderen von generierten Zeilen fdupes
) einen Fehler aus, führt aber nichts mit diesen Dateien aus. Es werden jedoch alle nicht markierten gültigen Dateinameneinträge in gelöscht filesToDelete
.
Antwort3
Hier ist ein kurzes Skript, um das erste angegebene Verzeichnis zu priorisieren. Es löscht keine Dateien direkt, sondern druckt nur eine Liste zum Löschen aus. Es befolgt diese Regeln:
- Drucken Sie keine Dateien von
dir1
Wenn eine Datei nicht darin enthalten ist
dir1
, drucken Sie sie nicht.#!/usr/bin/env bash # priority_dup.sh dir1 dir2 [dir3 ...]` set1=() # List collects all matching files for a set. IFS=$'\n' fdupes -r "$@" | while read i; do if [[ "$i" == "" ]]; then # Create new set, minus all files from dir1. set2="$(echo "${set1[*]}" | grep -v "^$1/")" # If the sets are different, then we can print files for deletion. if [[ "${set1[*]}" != "$set2" && "$set2" != "" ]]; then echo "$set2" echo "" set1=() fi else set1+=("$i") fi done
Speichern Sie es in einer Datei, legen Sie die Datei als ausführbar fest und versuchen Sie es.