Shellscript - bestimmte Datei löschen (mehrfach vorhanden)

JohnDoe

Erfahrenes Mitglied
Hallo Leute,

ich habe diverse Dateien aus dem Internet heruntergeladen. Alle Dateien haben die selbe Namenskonvention. Leider sind einige Dateien dabei, welche zwar der Namenskonvention entsprechen, aber der Inhalt ist immer der selbe.
Diese Dateien möchte ich löschen.
Ich denke mal, das geht via MD5-Hash. Aber ich habe das leider noch nicht weiter ausarbeiten können, da ich nicht weiß, wie ich alle Dateien eines Ordners via Script bearbeiten kann.
Die MD5-Summe habe ich dann.
Ich habe mich schon mit dem Befehl md5sum beschäftigt. Leider ist es hier so, dass neben der MD5-Summe auch noch einmal der Name der Datei ausgegeben wird.
Ich denke mal, dass Script muss ungefähr so ablaufen:
1. Jede Datei in Schleife abarbeiten
2. md5_var = md5sum Dateiname
3. if md5_var = [CHECKSUMME] & Dateiname löschen

Leider scheitere ich schon am ersten Schritt.
Könnt ihr mir da helfen?
Danke im voraus...
 
Hier mal ein kleines Script welches schonmal die Checksummen aller im aktuellen Verzeichnis befindlichen Dateien ausgibt.
Du musst dann halt noch Dateinamen und Checksumme trennen (z.B. mit awk) und dann herausfinden ob es die Pruefsumme bereits gibt.
Bash:
for i in *;
do FILE=`find ./ -type f -name "$i"`;
if [ "$FILE" != "" ]; then
md5sum "$FILE";
fi;
done

Nachtrag:
Mit dem folgenden Script erhaeltst Du die Daten getrennt.
Bash:
for i in *; do
FILE=`find ./ -type f -name "$i"`;
if [ "$FILE" != "" ]; then
SUM=`md5sum "$FILE" | awk -F ' ' '{ print $1 }'`;
echo $FILE;
echo $SUM;
fi;
done
Dadurch hast Du dann den Dateinamen in $FILE und die Pruefsumme in $SUM.

Nachtrag 2:
Ich hatte grad mal etwas Langeweile und hab das hier gestrickt:
Bash:
#!/bin/sh
for i in *; do
 FILE1=`find ./ -type f -name "$i" -maxdepth 1`
 if [ "$FILE1" != "" ] && [ -r "$FILE1" ]; then
  SUM1=`md5sum "$FILE1" | awk -F ' ' '{ print $1 }'`
  for j in *; do
   FILE2=`find ./ -type f -name "$j" -maxdepth 1`
   if [ "$FILE2" != "" ] && [ "$FILE2" != "$FILE1" ] && [ -r "$FILE2" ]; then
    SUM2=`md5sum "$FILE2" | awk -F ' ' '{ print $1 }'`
    if [ "$SUM1" = "$SUM2" ]; then
     echo "$FILE2 is equal to $FILE1"
     echo "Deleting $FILE2"
     rm "$FILE2"
    fi
   fi
  done
 fi
done
Schau Dir das alles genau an damit Du nachvollziehen kannst was passiert. Wenn Du Fragen dazu hast, immer her damit.
 
Hi.

Das Ganze hättest du aber auch mit deutlich weniger Aufwand haben können (nächstes Mal :suchen:): http://premium.caribe.net/~adrian2/fdupes.html

(Gibt's auch noch in Perl und Python Versionen)

Man sollte übrigens vorher auch erst noch die Dateigröße vergleichen - hat ja keinen Sinn die MD5 Summe zu berechnen wenn die Dateien nicht mal gleich groß sind.

Gruß
 
Danke für eure Tipps und danke für das Script, Dennis.
Ich bin es gerade im Geiste durchgegangen und denke, ich verstehe den Ablauf. Aber selbst wäre ich wahrscheinlich nicht drauf gekommen.

Mfg
Tobias
 
Man sollte übrigens vorher auch erst noch die Dateigröße vergleichen - hat ja keinen Sinn die MD5 Summe zu berechnen wenn die Dateien nicht mal gleich groß sind.
Schon richtig, da hatte ich nicht dran gedacht. War auch nur mal heute morgen mal eben so zusammengefummelt. Wie gesagt, hatte was Langeweile und fand das waer doch mal eine nette Ablenkung.
 
Zurück