PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Löschen duplizierter Files



opaque
03.02.05, 16:42
Hallo zusammen,

folgendes Problem:
Nachdem der iTunes Ordner mehrmals von einem Rechner auf einen anderen kopiert worden ist und die 2 Optionen (Musik verwalten und zu iTunes Ordner hinzufügen) aktiv waren und nicht immer der Ordner sondern auch manchmal die Tracks via drag and drop in zu iTines hinzugefügt wurden habe ich jetzt die xfache Anzahl an gleichen Files/Tracks. Nun meine Frage da Linux ja wirklich ein koplettes System ist gibt es hier sicher eine Lösung um duplizierte Files aufzustöbern und zu löschen.

Da ich aber gerade mit Linux angefangen habe finde ich keine fertige Lösung wie man das Problem beheben könnte.

Meine Ansätze für das Script wären: Nach gleich großen Datein suchen, wenn der Name bis auf die letzten 2-3 Buschstaben (excl. .mp3/aac/ma4) gleich ist alle ausser einen (den kurzesten ->[string]) löschen. Fertig

Die Filenamen lauten:

01 Trackname.mp3
01 Trackname 1.mp3
01 Trackname 2.mp3

Ist das ein möglicher Weg?

Walter

Sauerkraut
03.02.05, 17:13
..................

tictactux
03.02.05, 20:30
Hi,

kleines Kochrezept für ein Shell-Skript:

1. IFS auf Zeilenende setzen (wg. Leerzeichen in Dateinamen)
2. find Startverzeichnis/ -type f -printf "%s\t%p\n" | sort -n
die Ausgabe könnte mit -fprintf statt -printf in eine Temporärdatei
geschrieben werden.
3. obige nach Größe sortierte Liste durchlaufen (mit read zeilenweise einlesen),
bei jeder Änderung des ersten Feldes (Größe) die entsprechenden Zeilen
mit grep extrahieren, Ergebnis an ein zweites Script (oder per Pipe an
einen Befehlsblock) übergeben
4. die Dateien dieser Teilliste mit cmp vergleichen, bei Gleichheit
alle bis auf erste löschen.
Hoffe das hilft,
Wolfgang

Nachtrag: obige Vorgehensweise basiert also auf der Dateigröße, und auf
Byte-weisem Vergleich im Falle gleicher Größe, hat aber keine "Intelligenz"
dazu, welche der mehrfach vorhandenen Dateien erhalten, bzw. gelöscht
wrden (die erste in der Liste überlebt :D )

opaque
04.02.05, 12:18
Hallo, danke für die schnelle Antwort doch wie schon gesagt bin ich Anfänger unter Linux und um mit dem was Ihr mir geschrieben habt was anfangen zu können bräuchte ich noch ein Scripting HOWTO - kennt jemand so eines (vorzugsweise in deutsch).

ansonsten würde ich mich über den Code welchen ich in ein leeres Dokument kopieren kann und mittels chmod +x finalisieren kann auch freuen.

walter

Susu
04.02.05, 12:55
fdupes (http://freshmeat.net/projects/fdupes/)

Susu

Sauerkraut
05.02.05, 21:49
............

opaque
14.02.05, 09:27
Hallo nochmal,

fdupes funktioniert nur hab ich es damit noch nicht geschafft das nur die files welche am Schluß 1,2,3 (01 Track 1.mp3, 01 Track 2.mp3,…) stehen haben gelöscht werden und der orginal file (01 Track.mp3) erhalten bleibt. Wie es scheint löscht das Programm alle ausser einen ohne rücksicht auf eine sortierung oder sonst was zu nehmen.

walter

tictactux
22.02.05, 16:55
für iTunes Benutzer hier eine erweiterte und besser konfigurierbare Version
des ursprünglich geposteten Skriptes.
Es löscht Duplikate, die durch (automatisches) Anhängen von z.B. Nummern
an den Dateinamen von bereits vorhandenen Dateien entstehen aus einem
Verzeichnisbaum.
Gleichheit von Dateien wird anhand von MD5-Summen erkannt.
Details zur Benutzung und Anpassung sind im Code enthalten.

Anmerkung: das ursprüngliche Zielsystem verfügte nicht über aktuelle
Versionen von Tools (wie uniq), so daß einiges nachgebildet wurde.
kill-dupes:


#!/bin/bash
# kill-dupes: Suche/Lösche Duplikate
#>>>>>>> ab hier suchen (Umgebungsvariable DUPSTART geht vor)
STARTDIR=${DUPSTART:-/Data/mp3-bak/}
DIRTMP=$PWD
#>>>> Kommentar vor DIRTMP entfernen, um Dateilisten da zu erstellen
#DIRTMP=/tmp

SUMLIST="$DIRTMP/dupesums.txt"
DUPLIST="$DIRTMP/dupelist.txt"

# nur TABs und Zeilenvorschub als Feldtrenner interpretieren (wg. Leerzeichen in Dateinamen)
IFS='
'
fQuiet=0
fNoOp=0
fKeep=0
sRmArgs="-v"

#----- Anleitung
usage() {
cat <<-EOM
kill-dupes Ver. 0.1 SE :)
Aufruf: $0 [-? -h --help -n -q -k]
Sucht und löscht doppelte Dateinamen ab einem Startverzeichnis.
Das Dateimuster (*.mp3, *.ogg, *.m4a) ist im Script editierbar.
Vorgabe $DUPSTART (kann in Umgebungsvariablen DUPSTART vorgegeben werden)
-?,-h,--help zeigt diese Anleitung
-n (noop) kein Löschen, nur Aktionen zeigen (analog zu make -n)
-q (quiet) keine Ausgabe der gelöschten Dateinamen
-k (keep) die Arbeitsdatei dupelist.txt wird nicht gelöscht
(zur Problemdiagnose)

Duplikate werden anhand von MD5-Summen und Dateinamen erkannt (nur innerhalb
eines Verzeichnisses). Spezielles Kriterium: erhalten wird die Datei mit dem
kürzesten Namen (bei Duplikaten wird eine angehängte Nummer erwartet).
Benötigte Tools: find, sort, md5sum, uniq
EOM
}

#---- ab geht's
# Prüfung auf Argumente
while [ $# -gt 0 ] ; do
case "$1" in
-n) # simuliert nur, kein Löschen (Diagnose)
fNoOp=1
;;
-k) # behalte Duplikatliste
fKeep=1
;;
-\?|-h|--help)
usage
exit 0
;;
-q) # kein Echo der Löschoperation...
fQuiet=1
sRmArgs=""
;;
*)
usage
exit 1
;;
esac
shift
done

[ -f "$DUPLIST" ] && rm "$DUPLIST"
# >>>>>>>>>> Dateimuster hier anpassen
# erstelle nach Größe sortierte Liste im Format: Größe Dateiname Dateiname_mit_Pfad
find $STARTDIR -type f \( -iname '*.mp3' -o -iname '*.ogg' -o -iname '*.m4a' \) |
while read fNAME ; do md5sum "$fNAME" ; done >$SUMLIST
sort -r -k 2 -t ' ' $SUMLIST | uniq -w 32 -D >$DUPLIST
[ -f "$SUMLIST" ] && rm "$SUMLIST"
sLastSum=""
sSum=""
sFname=""
sSavedFile=""
fDoRm=0
IFS=" " # SPACE+TAB !
while read sSum sFname ; do
[ -z sFname ] && break
[ -z "$sSavedFile" ] && sSavedFile="$sFname"
if [ "$sSum" == "$sLastSum" ]; then
# MD5 schon gesehen: als Löschkandidaten markieren
fDoRm=1
else # neue MD5-Summe/Datei, merken
sLastSum=$sSum
sSavedFile="$sFname"
fDoRm=0
fi
if [ "$fDoRm" == "1" ]; then
IFS=" " # TAB!
[ "$fQuiet" == "0" ] && echo "Original: $sSavedFile"
if [ "$fNoOp" == 1 ] ; then
echo "noop: rm $RmArgs --" "$sFname"
else
if [ -f "$sFname" ]; then
rm $RmArgs -- "$sFname"
fi
fi
fi
IFS=" " # SPACE+TAB !
done < $DUPLIST
if [ "$fKeep" == "0" ]; then
[ -f "$DUPLIST" ] && rm "$DUPLIST"
fi
exit 0
# vim: ts=4:sw=4:sts=0

Viel Spaß damit,
Wolfgang