• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

doppelte Dateien finden und löschen

delwin

Newbie
Hi,

da ich nichts passendes hier im Forum gefunden habe, schreibe ich halt selber mal ne (An)Frage.

So, mein Prob ist, das ich hier eine Ansammlung von tausenden Dateien in verschiedenen Ordnern und Unterordnern und und und in einem großen Ordner habe.
In dem ganzen Ordnernetzwerk liegen zum Teil an verschiedenen Pfaden die selben Dateien, oder gleichnamige Dateien mit fast gleicher größe.

ich bräuchte jetzt also einen Befehl, ein Prog das mir alle Namen der Dateien vergleicht (größe und inhalt der Dateien ist egal!), und von den doppelte Datein (inhalt egal) eins löscht.
wo die dateien nachher sind, ob die in einem extra ordner abegelegt werden, oder ob die sich dann noch in dem Odnernetzwerk befinden ist mir egal.

Ansatz wäre vielleicht ein skript das durch alle ornder durchgeht, und alle Dateien in einen ordner kopiert. wenn der name schon existiert einfach überschreiben, oder löschen.
das wäre sogar eine möglichkeit. doch wie stelle ich das jetzt als unerfahrener skripteschreiber an?? (wäre auch für gute links dankbar, dann bringe ich es mir selber bei).

oder gibt es schon progs?

gruss
delwin
und danke.
 

TeXpert

Guru
hier im Forum sind genug Anleitugen für den Programmiereinstieg verlinkt ... einfach mal schauen :)

zum Problem, wenn einzig der Dateiname ausschlaggebend ist, würde ich das im ersten Schritt mal so anpacken:

Dateiliste, nach Dateinamen sortieren, doppelte finden und dann alle bis auf einen löschen. Als 1. Lesestoff neben dem Forum,

man find
man sort
evtl. man uniq
 
Mein Vorschlag:

find . -type f -print | while read filename
do
SUM=`md5sum $filename`
echo $filename " " $SUM
done > tempfile
sort +1 tempfile => tempfile2

...
Dann in tempfile2 schauen, wo die md5sum gleich ist
.. dateien mit gleicher md5sum mit "diff" vergleichen, evtl. eine löschen.

Haveniceday

PS: Ist ne schöne "Anfängerübung" :)
 

regexer

Advanced Hacker
delwin schrieb:
ich bräuchte jetzt also einen Befehl, ein Prog das mir alle Namen der Dateien vergleicht (größe und inhalt der Dateien ist egal!), und von den doppelte Datein (inhalt egal) eins löscht.
Hier ist mein Lösungsansatz, den du sicher noch für deine Zwecke anpassen musst. Der Aufruf erfolgt mit
Code:
script.pl /verzeichnis1 /verzeichnis2 ...
Wenn kein Verzeichnis angegeben wurde, wird das aktuelle genommen. Ich benutze keine Zwischenverzeichnisse oder sonstiges. Ich gehe einfach nur eine Liste des Linux-find durch, und lösche, wenn ein Dateiname schon mal dagewesen ist. Bitte erstmal mit der print-Ausgabe testen. Wenn du dir der Sache sicher bist, kannst du den Kommentar vor dem "unlink" entfernen. Dann löscht das script wirklich...
Code:
#!/usr/bin/perl

use strict;
my %gefunden;

open (FINDLIST, "find @ARGV -type f | sort -u |") or die "Fehler beim ausfuehren von find: $!\n";
while (<FINDLIST>) {
   chomp;
   next if (-d $_);                  # Verzeichnisse ueberspringen
   my $filename=(split /\//)[-1];    # Verzeichnisnamen wegschneiden
   if ($gefunden{$filename} > 0) {   # War die Datei schon mal da?
     print "loesche $_\n";
#     unlink $_;                      # Wenn man sich der Sache sicher ist...
   } else {
     $gefunden{$filename}++;
   }
}
close FINDLIST;
EDIT: Wenn ich mir's recht überlege, ist die Stelle mit dem find @ARGV ziemlich gefährlich. Was ist, wenn zweimal das gleiche Verzeichnis als Argumente übergeben wird? Deshalb habe ich einen "sort -u" hinder den find gehängt. Wenn man es ganz sicher haben will, könnte man auch nur den ersten Parameter verarbeiten. In diesem Falle müsste man @ARGV durch $ARGV[0] ersetzten.
NOCH EIN EDIT: Zur Sicherheit könnte man dem find ein "-type f" mitgeben. So würden Links, Verzeichnisse und Ähnliches nicht berücksichtigt.
 
Falls es ein fertiges Programm sein darf:

http://www.pixelbeat.org/fslint/

Lass Dich nicht täuschen, das Tool hat zwar ein GUI, aber Du kannst die Backend-Skripte auch einzeln aufrufen. Und es muss nicht installiert werden, Du kannst es auch direkt aus dem entpackten Archiv starten.
 
Oben