Doppelte Dateien finden und löschen

Status
Für weitere Antworten geschlossen.
ianders

ianders

Linux Jungspund
Hallo ihr,

ich bin gerade dabei mir ein Script zusamen zu basteln welches doppelte Dateien findet und nach Wahl auch löschen kann. Dabei gehe ich davon aus, dass sich die gleichen Dateien in verschiedenen Verzeichnissen befinden.
leider habe ich vom Script schreiben nicht viel Ahnung und habe mir daher mit Google weiter geholfen, verschiedenes mit Testdateien rumprobiert bis ich zumindest die erste Scripthälfte zusammen hatte. Aber jetzt komme ich nicht weiter, daher die Frage ob ihr nicht ein paar Ideen habt wie ich das Script fertig bekomme. :hilfe2:
Code:
[COLOR=Gray][I]geänderte Version:[/I][/COLOR]
#!/bin/bash
trap 'test -d doppelttmp && rm -r doppelttetmp; exit 1' 2
mkdir doppelttmp

echo "Für jede Datei die Prüfsumme berechnen und in einer temporären Datei speichern"
echo "Verzeichniss angeben aber ACHTUNG Achtung: nichs fuer $HOME:"
read verz

# Für jede Datei die Prüfsumme berechnen und in temporärer Datei speichern

if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -exec md5sum {} \; > doppelttmp/sum.unsorted
    #cat doleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -exec md5sum {} \; > doppelttmp/sum.unsorted
    #cat doleer.tmp
fi
# Die Prüfsummen sortieren
sort < doppelttmp/sum.unsorted > doppelttmp/sum.sorted
# Alle Doppelten Summen finden und speichern
cut -f 1 -d " " doppelttmp/sum.sorted | uniq -d > doppelttmp/sum.dupe
# Die Dateinamen zu den Doppelten Summen finden und ausgeben
grep -F -f doppelttmp/sum.dupe doppelttmp/sum.sorted
echo "Verzeichniss angeben aus welchem die Dateien gelöscht werden sollen. Achtung: nichs fuer $HOME:"
read verz

# Dateien im Angegebenen Verzeichnis löschen, sofern sie in der Liste der doppelten Dateien sind 

[I]# wie macht man das?[/I]

# aus weierem Verzichnis dateien löschen oder programm ende

[I]# wie macht man das?[/I]

# test -d doppelttmp && rm -r doppelttmp
exit 0

#-----ERRORCODES-----
#1 -- CTRL + C abbruch
Danke :)
 
Zuletzt bearbeitet:
# Dateien im Angegebenen Verzeichnis löschen, sofern sie in der Liste der doppelten Dateien sind

echo "wie macht man das??????????????????????????????????????"

# aus weierem Verzichnis dateien löschen oder programm ende

echo "wie macht man das??????????????????????????????????????"
das ist mal ziemlich daneben und hättest du dir wirklich sparen können.
wenn du unbedingt das hier gepostete skript "fertigstellen" willst (rather than use fdupes), rate ich dir zur lektüre von
Code:
man uniq
einen tip geb ich dir mal:
Code:
uniq -w 32
bzw:
Code:
uniq --check-chars=32
vergleicht jeweils nur die ersten 32 zeichen. (jetzt rate mal, wie lang die hexadezimale darstellung einer md5 summe ist..)

und weils so schön ist:
Code:
echo "123456789abcdef /path/to/sum/file/file.html" | awk '{print $2}'
gibt dir nur "/path/to/sum/file/file.html" aus.

da du uns ja in unsäglich eloquenter manier deinen wissensstand was bash-skripte angeht mitgeteilt hast ("WIE MACHT MAN DAS??????????????????????????????????"), kann(/will) ich dir nicht spezifischer helfen.
 
@Gott_in_schwarz:

das ist mal ziemlich daneben und hättest du dir wirklich sparen können.
1. Zitiere gefälligst richtig !!

da du uns ja in unsäglich eloquenter manier deinen wissensstand was bash-skripte angeht mitgeteilt hast
2. Bevor Du hier mal wieder jemanden dermaßen niedermachst ... hast du schon mal was von Groß- und Kleinschreibung gehört ?!!

3. Was soll eigentlich dieses Herabwürdige in deinen Threads ? Hast Du ständig diese Anfälle ? Falls ja, dann solltest Du mal einen Arzt konsultieren !

kann(/will) ich dir nicht spezifischer helfen.
4. Verlangt auch keiner von dir.

a) Er hat klargemacht, dass er zuerst selber Initiative ergriffen hat.
b) Er hat keine Ahnung von Shell-Scripten (und von Programmierung generell?).

Nun hab dich wohl ... (oder auch nicht ...)
 
es ging schlicht und ergreifend um das hier:
echo "wie macht man das??????????????????????????????????????"
Code:
echo -n "wie macht man das??????????????????????????????????????"|egrep -o '\?+'|wc -c
39
was ist so schlimm daran ihm mitzuteilen, dass er sich 38 von den 39 fragezeichen hätte sparen können?

1. Zitiere gefälligst richtig !!
und du schreibe bitte richtiges deutsch.
groß- und kleinschreibung sind mir geläufig, jedoch verzichte ich bewusst darauf. (tippt sich leichter...)

btw: wo habe ich denn bitte hier falsch zitiert?
 
Artet jetzt hier JEDER Thread aus?

groß- und kleinschreibung sind mir geläufig, jedoch verzichte ich bewusst darauf. (tippt sich leichter...)
Gewöhnungssache. Mir rutscht das mittlerweile aus der Hand.
 
Komm, ich nehm' dich mal an die Hand ...

es ging schlicht und ergreifend um das hier:
echo "wie macht man das??????????????????????????????????????"

Und nun das andere Händchen ...

was ist so schlimm daran ihm mitzuteilen, dass er sich 38 von den 39 fragezeichen hätte sparen können?
Wo sind denn seine 39 Fragezeichen ?

und du schreibe bitte richtiges deutsch.
Oh mein Gott (nicht du) - ich habe mir einen Rechtschreibfehler erlaubt.

groß- und kleinschreibung sind mir geläufig ...
Das glaub' ich nicht so recht ...

... jedoch verzichte ich bewusst darauf. (tippt sich leichter...)
Achso ... also ianders wirfst du Faulheit (indirekt) vor, bist aber selber so.
Ah, ja.

So, nun ist der Kindergarten zu und ab in die Haja.
 
moin,

danke für die Tipps, aber irgendwie geht das noch nicht so ganz wie gewünscht, habe wohl noch nicht raus wie mit uniq richtig umgegangen wird...
Code:
[I][COLOR="Gray"]veränderte Version:[/COLOR][/I]
#!/bin/bash
trap 'test -d doppelttmp && rm -r doppelttetmp; exit 1' 2
mkdir doppelttmp

echo "Für jede Datei die Prüfsumme berechnen und in einer temporären Datei speichern"
echo "Verzeichniss angeben aber ACHTUNG Achtung: nichs fuer $HOME:"
read verz

# Für jede Datei die Prüfsumme berechnen und in temporärer Datei speichern

if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -exec md5sum {} \; > doppelttmp/sum.unsorted
    #cat doleer.tmp
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -exec md5sum {} \; > doppelttmp/sum.unsorted
    #cat doleer.tmp
fi
# Die Prüfsummen sortieren
sort < doppelttmp/sum.unsorted > doppelttmp/sum.sorted
# Alle Doppelten Summen finden und speichern
cut -f 1 -d " " doppelttmp/sum.sorted | uniq -d > doppelttmp/sum.dupe
# Die Dateinamen zu den Doppelten Summen finden und ausgeben
grep -F -f doppelttmp/sum.dupe doppelttmp/sum.sorted
echo "Verzeichniss angeben aus welchem die Dateien gelöscht werden sollen. Achtung: nichs fuer $HOME:"
read verz

# Dateien im Angegebenen Verzeichnis löschen, sofern sie in der Liste der doppelten Dateien sind 
if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -exec md5sum {} \; > doppelttmp/sum.loesch
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -exec md5sum {} \; > doppelttmp/sum.loesch
fi
# Die Prüfsummen sortieren
sort < doppelttmp/sum.loesch > doppelttmp/sum.sortloesch
# vergleiche die ersten 32 Zeichen in den Zeilen der beiden dateien und erstelle eine datei mit den übereinstimmungen
uniq --check-chars=32 < doppelttmp/sum.dupe doppelttmp/sum.sortloesch > doppelttmp/sum.wegdamit
# Die Dateinamen zu den Doppelten Summen finden und ausgeben
grep -F -f doppelttmp/sum.dupe doppelttmp/sum.wegdamit

#  echo "SICHER DASS ALL DIESE DATEIEN GELÖSCHT WERDEN SOLLEN? (y/n)"
#  echo ' yes ? '
#    read best
#    if [ "$best" = y ] ; then
#       echo "geht noch nicht mangels idee"
#    fi

# aus weierem Verzichnis dateien löschen oder programm ende
# wie macht man das?

# test -d doppelttmp && rm -r doppelttmp

echo "hier ist das Script zu ende. Das ist eine sehr sinnvolle Mitteilung ;-)"
exit 0

#-----ERRORCODES-----
#1 -- CTRL + C abbruch
p.s. die Fragezeichen habe ich gelöscht, siehe Änderungsbegründung oben
 
Zuletzt bearbeitet:
hmm ich fand die fragezeichen recht sinnvoll, damit man erkennt wo das Problem liegt?
Was ist nur los im UB? Es ist echt traurig das ständig irgendwelche Diskussionen in persönlichen beleidigungen enden!

Wenn man einen Befehl nicht kennt, kann man auch nicht die man-Pages dazu lesen
 
also erstmal:
Code:
if [ -z "$verz" ] ; then
    class=`groups`
    user=`whoami`
    echo "Suchen nach Dateien in /users/class/$class/$user..."
    find /users/class/"$class"/"$user" -exec md5sum {} \; > doppelttmp/sum.loesch
else
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -exec md5sum {} \; > doppelttmp/sum.loesch
fi
diese if-verzweigung, die btw zweimal im skript vorkommt, kannst du dir sparen...
(ich nehme mal stark an, dass du noch nichtmal einen ordner /users/class hast.. könnte mich natürlich irren.) und wie folgt zusammen schrumpfen:
Code:
    echo "Suchen nach Dateien in $verz..."
    find "$verz" -exec md5sum {} \; > doppelttmp/sum.loesch
und die doppelte verzeichnisabfrage ist IMHO auch nicht der gipfel der sinnhaftigkeit. damit könntest du übergeordnete ordner beschützen, aber (zumindest in der jetzigen form) nicht untergeordnete, weil find rekursiv arbeitet. (es sei denn, man verbietet es "ihm"..)
dann weiter im text:
Code:
uniq -w 32 < sum.sorted > keep.lst
gibt dir doppelte (und dreifache etc.) einträge jeweils nur einmal aus. triviales beispiel: (\n bedeutet "neue zeile")
Code:
echo -ne "bla\nbla\nbla\nblub\nblub\n"|uniq
gibt zum beispiel jeweils einmal bla und einmal blub aus. mit dieser keep.lst könntest du dann zum beispiel so die doppelten dateien mit hilfe der originalen "sum.sorted" liste löschen:
Code:
grep -vFf keep.lst sum.sorted
gibt also alle löschkandidaten mit md5sum aus, durch awk gepipet könnte man das dann bereits löschen:
Code:
for badFile in $(grep -vFf keep.lst sum.sorted|awk '{print $2}'); do
   echo "$badFile"
done
wobei du dann das echo durch rm ersetzen müsstest. außerdem habe ich den pfad "doppelttmp" weggelassen... aber ganz ehrlich: ich würde mein home-verzeichnis diesem zusammengeprügelten skript nicht anvertrauen, nimm lieber fdupes, oder nimm wenigstens "rm -i" oder so.. (wo sich dann wieder die frage stellt, ob das dann noch so die große hilfe ist, wenn man zu allem ja und amen sagen muss)



und zu guter letzt @ worker: lass es doch einfach sein.
Wo sind denn seine 39 Fragezeichen ?
hattest recht, es waren eigentlich nur 38 fragezeichen. wc -c hat auch das newline zeichen mitgezählt. und der satz von mir "schreib du bitte richtig deutsch" ist ein link, der dich auf eine von dir perpetuierte typographische unsitte des internets aufmerksam machen sollte, also einfach mal klicken und überraschen lassen..
So, nun ist der Kindergarten zu und ab in die Haja.
gute nacht.

ich bin offiziell aus diesem thread draußen.
 
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

verzeichniss suche funktioniert nicht

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Queue für copy Script

Zeilenweise suchen, löschen und ersetzen / Inhalt einfügen

Löschscript mit Logging

Zurück
Oben