Suchen und löschen Sie doppelte Dateien auf verschiedenen Festplatten und Verzeichnissen

969
Tuts

Ich habe Hunderttausende Dateien, die auf vielen externen Festplatten und Festplatten in Computern verteilt sind, und viele sind doppelt vorhanden. Dieses Chaos wurde dadurch verursacht, dass ich Kopien für Sicherheitsvorschläge erstellte. Von Zeit zu Zeit änderte ich die Verzeichnisstruktur meiner Organisation, replizierte jedoch nicht an anderen Stellen, an denen Kopien vorhanden waren.

Jetzt habe ich eine einzige große Festplatte mit fast allem, was ich wirklich brauche, um Backups zu erstellen und in die Cloud zu spiegeln.

Ich möchte eine Möglichkeit, alles von all den verteilten Festplatten zu löschen, die sich bereits auf der großen Festplatte befinden.

Lassen Sie mich die Szenerie zeigen:

OldDisk1:

/code// /docs// 

OldDisk2:

/dev// /documents// 

NewHugeDisk:

/home/username/code// /home/username/documents// 

Kennt jemand ein Werkzeug oder eine Möglichkeit, etwas zu tun wie "Alle Dateien auf OldDisk1 finden, die sich bereits in NewHugeDisk befinden und löschen"?

Ich habe mir viele Tools (Windows, Mac und Linux, da ich diese Ausgabe für beide Fälle habe) kostenlos und kostenpflichtig angesehen, aber ohne Erfolg.

Und Ideia würde einen Code dafür erstellen, aber ich bin kein Entwickler. Ich kann kleine und einfache Codes erstellen, aber diese Art von Code wäre für mich zu kompliziert.

Ich freue mich über jede Hilfe oder Ideen dazu.

1
Welche Werkzeuge haben Sie ausprobiert? Wie haben sie versagt? music2myear vor 6 Jahren 0
Wenn Sie Linux verwenden, hatte ich mit fslint etwas Glück. Natürlich sollten Sie sie als expliziten Prozess (nicht automatisch) löschen. Sie können jedoch eine Liste mit Dateinamen für ein Löschskript oder ein anderes Verfahren erstellen. Frank Thomas vor 6 Jahren 0
@ music2myear Ich habe viele Tools für Mac, Windows und Linux ausprobiert. Dies ist eine kurze Liste, die ich ausprobiert habe: Easy Duplicate, Duplifinder, Mr. Clean, Gemini 2, Dupe Guru, CCleaner, Duplicate File Finder, Auslogics Duplicate File Finder, Disk-Drill, Aufräumen, Duplicate Detective, Decloner, Clone Spy, Doppleganger. Es gibt viele andere, über die ich gelesen und sogar versucht habe, aber nicht das getan habe, was ich erwartet hatte. Tuts vor 6 Jahren 0
@Frank Thomas, ich habe es nicht ausprobiert, aber wenn ich lese, wird es mir nicht gelingen, das zu vollenden, was ich will. Tuts vor 6 Jahren 0
@ music2myear Ich habe vergessen deine zweite Frage zu beantworten. Alle diese Tools löschen alle doppelten Dateien, die auf dem von Ihnen angegebenen Pfad gefunden werden. Nehmen wir an, Sie geben / old / * und / new / * ein und haben nur auf das neue /new/dir1/a.txt und /new/dir2/a.txt. es wird eines von dann löschen. Ich möchte aber nur Dateien auf / old / * löschen. Tuts vor 6 Jahren 0

3 Antworten auf die Frage

2
flolilolilo

Angenommen, Sie können Windows als Betriebssystem für den gesamten Prozess verwenden und den Free Duplicate File Finder nicht mögen (habe es nie versucht, aber es wurde hier erwähnt ), könnten Sie PowerShell verwenden, um mit relativ wenig Aufwand zu erreichen, was Sie möchten. Hinweis: Ich bin kein echter Profi bei PowerShell, daher bin ich ziemlich sicher, dass man meinen Code verfeinern kann.

Öffnen Sie einfach Powershell ISE (oder verwenden Sie Notepad, wenn Sie diesen nicht haben), kopieren Sie den folgenden Code, fügen Sie ihn ein und speichern Sie die resultierende Datei als * .ps1. Sie müssen auch ändern $oldpath‚s und $newpath‘ s - Werte auf Ihre Verzeichnisse - einfach Ihre Wege zwischen den Anführungszeichen.

# Search-and-Destroy-script # Get all files of both code-directories: $oldpath = "Disk1:\code" $newpath = "DiskNew:\code"  $files_old = Get-ChildItem -Path $oldpath -Recurse -File $files_new = Get-ChildItem -Path $newpath -Recurse -File  for($i=0; $i -lt $files_old.length; $i++){ $j=0 while($true){ # if last edit time is the same and file-size is the same... if($($files_old[$i]).length -eq $($files_new[$j]).length -and $($files_old[$i]).lastWriteTime -eq $($files_new[$j]).lastWriteTime){ # Get File-Hashes for those files (SHA1 should be enough) $files_old_hash = Get-FileHash -Path $($files_old[$i]).FullName -Algorithm SHA1 | ForEach-Object {$_.Hash} $files_new_hash = Get-FileHash -Path $($files_new[$j]).FullName -Algorithm SHA1 | ForEach-Object {$_.Hash} # if hashes also are the same... if($files_old_hash -eq $files_new_hash){ # remove the old file (-Confirm can be removed so you don't have to approve for every file) # if you want to check the files before deletion, you could also just rename them (here we're adding the suffix ".DUPLICATE" # Rename-Item -Path $($files_old[$i]).FullName -NewName "$($files_old[$i]).Name.DUPLICATE" Remove-Item -Path $($files_old[$i]).FullName -Confirm Write-Host "DELETING`t$($files_old[$i]).FullName" -ForegroundColor Red break } # if files aren't the same... }else{ # if old_file is compared to all new_files, check next old file if($j -ge $files_new.length){ break } } $j++ } } 

Starten Sie dann das Skript (z. B. mit der rechten Maustaste). Wenn dies fehlschlägt, stellen Sie sicher, dass Sie ExecutionPolicyfestgelegt sind ( https://superuser.com/a/106363/703240 ).

Ich verwende ein fast identisches Skript, um nach bereits kopierten Dateien zu suchen (möglicherweise jedoch mit geänderten Namen). Dieser Code setzt voraus, dass nur die Namen der Dateien unterschiedlich sind, nicht jedoch der Inhalt. Die letzte Bearbeitungszeit bleibt normalerweise gleich, selbst wenn Sie eine Datei in einen neuen Pfad kopieren - anders als die Erstellungszeit. Wenn der Inhalt anders ist, schlägt meine Lösung fehl. Sie können andere eindeutige Attribute von Dateien verwenden (aber welche?) Oder angeben, dass z. B. nur Dateien kleiner oder älter sind (was wiederum die Bearbeitungszeit betrifft) als die neuen Dateien gelöscht

Was macht das Skript:

  1. Abrufen aller Dateien in den angegebenen Ordnern (und ihren Unterordnern)
  2. Erste alte Datei abrufen (durch $ i angegeben) ...
  3. Vergleich der letzten Bearbeitungszeit und der Dateigröße mit der der ersten neuen Datei (durch $ j angegeben) ...
  4. Wenn sie gleich sind, berechnet sie einen Datei-Hash, um sicher zu gehen, dass es sich definitiv um dieselbe Datei handelt (dies könnte ein zu hoher Aufwand für Ihr Ziel sein).
  5. Wenn die Hashwerte gleich sind, wird die alte Datei gelöscht (und es wird geschrieben, welche Datei in das Terminal geschrieben wird). Anschließend wird wieder bei 2. mit der nächsten alten Datei begonnen.
  6. Wenn die Hashwerte nicht gleich sind (oder die letzten Bearbeitungszeiten nicht gleich sind oder die Dateigrößen nicht gleich sind), beginnen sie wieder bei 3. mit der nächsten neuen Datei.
Es ist genau das, was ich brauchte. Vielen Dank. Obwohl ich in der Lage wäre, nur an Fenstern zu arbeiten, um meine Probleme zu lösen, werde ich versuchen, "diesen Code zu replizieren" (wenn Sie mir erlauben) in bash, da ich es in der Lage sein werde, ihn auf meine Raspiberry-Festplatte zu setzen solange es braucht. Ich habe bereits ein wenig korrigiert, da es nicht richtig funktionierte: alte Zeile `für ($ i = 0; $ i -lt $ files_new.length; $ i ++) {` neue Zeile `für ($ i = 0; $ i -lt $ files_old.length; $ i ++) {`Wenn ich das Shell-Skript erstelle, werde ich es hier posten. Tuts vor 6 Jahren 0
Das ist eine schön gebaute Lösung. music2myear vor 6 Jahren 0
@Tuts Danke, ich habe diese Zeile gerade behoben. Ich freue mich schon sehr auf das resultierende bash-script! flolilolilo vor 6 Jahren 0
0
user8010482

Haben Sie versucht, Deduplizierungssoftware von Drittanbietern zu verwenden?
Ich habe Cloudberry-Deduplizierung ausprobiert und es ist wirklich effizient als:

  • Es verfügt über einen eigenen Dedup-Mechanismus, um doppelte Daten zu vermeiden und somit viel Speicherplatz zu sparen.
  • Ein weiterer Vorteil solcher Tools ist, dass sie zuverlässiger sind und über ein dediziertes Ressourcenmanagement verfügen.
Können Sie einen Link zur Software einfügen? yass vor 6 Jahren 0
Bitte lesen Sie * [Wie empfehle ich Software in meinen Antworten?] (Https://meta.superuser.com/a/5330/432690) * und [bearbeiten] Ihre Antwort entsprechend. Kamil Maciorowski vor 6 Jahren 0
https://www.cloudberrylab.com/dedup-server.aspx user8010482 vor 6 Jahren 0
Ich habe keine Cloudberry für die Deduplizierung. Aber jetzt schauen, es ist eine Windows-Server-Software (für mich zu Hause). und trotzdem sieht es nicht so aus, als würde es mein Problem behandeln. Das heißt, ich habe eine neue Festplatte und viele alte Festplatten. Es gibt Duplikationen auf den neuen Festplatten (mittlerweile ist es mir egal) und möglicherweise auf alten Festplatten. Was ich im Grunde nicht will, ist das, was ich bereits auf den neuen Festplatten habe. (Neue Festplatte ist eine Kopie aller anderen Festplatten.) Tuts vor 6 Jahren 0
0
thomas_d_j

rmlint is a command-line utility with options to do exactly what you want. It runs on Linux and macOS. The command you want is:

$ rmlint --progress \ --must-match-tagged --keep-all-tagged \ /mnt/OldDisk1 /mnt/OldDisk2 // /mnt/NewHugeDisk 

This will find the duplicates you want. Instead of deleting them directly, it creates a shell script (./rmlint.sh) which you can review, optionally edit and then execute to do the desired deletion.

The '--progress' option gives you a nice progress indicator. The '//' separates 'untagged' fro 'tagged' paths; paths after '//' are considered 'tagged'. The '--must-match-tagged --keep-all-tagged' means only find files in untagged paths that have a copy in a tagged path.

You can also shorten that command using the short format of the options:

rmlint -g -m -k /mnt/OldDisk1 /mnt/OldDisk2 // /mnt/NewHugeDisk 
klingt wie es wirklich genau das ist, was ich brauche. Ich habe nur ein paar schnelle Tests gemacht und sieht vielversprechend aus. Will noch ein paar Tests machen. Danke vielmals. Tuts vor 6 Jahren 0
Bitte. Bitte verwenden Sie https://github.com/sahib/rmlint/issues, um Probleme oder Verbesserungsvorschläge zu melden thomas_d_j vor 6 Jahren 0