PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Doppelte Dateien durch Namen rausfinden und die größte behalten



Basti_litho
09-02-2004, 08:43
Hallo,

hab hier ein Verzeichnis (Internet Radio) in dem sehr viele MP3s liegen. Nun sind aber viele (da Internet Radio) doppelt und ich möchte nur die Größte Datei behalten.

Alle Programme die ich gefunden hab, die doppelte Dateien rausfinden und löschen können, benutzen hierfür MD5sum. Leider hilft mir das nicht viel - da die Streams bzw. MP3s nicht gleich lang sind und MD5sum sie als unterschiedlich kennzeichnet.

Die Dateien liegen in solch einem Dateinamen vor:

004_Swayzak_-_Take_My_Hand.mp3
010_Swayzak_-_In_The_Car_Crash.mp3
018_Swayzak_-_Celcius.mp3
032_Swayzak_-_Take_My_Hand.mp3
038_Swayzak_-_In_The_Car_Crash.mp3
048_Swayzak_-_Ping_Pong.mp3
058_Swayzak_-_Ping_Pong.mp3
073_Swayzak_-_Ping_Pong.mp3
095_Swayzak_-_In_The_Car_Crash.mp3

mit:
/bin/ls |cut -c 5- |sort |uniq -c

kann ich mir schonmal anzeigen lassen welche doppelt sind.

Edit: ok, mit:

while read zeile; do ls -S ???_"`echo "$zeile" |cut -c 3-`"; done < doppelt.txt

Kann ich nun, mir die Dateien der größe nach auflisten lassen.

Aber wie lösch ich nun die kleineren?

Hat jemand ne Idee dazu?

Gruss,
Basti

peschmae
09-02-2004, 08:47
die Grösse einer Datei findest du mit dem Konstrukt da:



FILE=/blubber/mp3file.mp3
FILESIZE=$(ls -s "$FILE" | sed "s/\([0-9]\+\).*/\1/" | sed "s/[ \t]*//")


MfG Peschmä

Basti_litho
09-02-2004, 09:04
Ok,

nun hab ich mit diesem Befehl zumindest schon mal die richtige Richtung eingeschlagen:

while read zeile; do rm -i "$( /bin/ls -S ???_"`echo "$zeile" |cut -c 3-`" |tail -n 2 )"; sleep 2; done < doppelt.txt

Leider bekomm ich nun so eine Ausgabe:


rm: Aufruf von lstat für »092_AbA Structure - Ebb Tide.mp3\n007_AbA Structure - Ebb Tide.mp3« nicht möglich: Datei oder Verzeichnis nicht gefunden

Anscheinend wird das Newline Zeichen von der Shell nicht mehr verarbeitet.

:(

Basti_litho
09-02-2004, 09:56
So, dritter Anlauf. :)

habs nun in ein skript gepackt - sieht so aus:



#!/bin/bash

# doppelte finden und in /tmp/doppelte.txt speichern

/bin/ls |cut -c 5- |sort |uniq -c -d |sort -ng > /tmp/doppelte.txt


# liste der doppelten dateien Zeilenweise auslesen
und mit ls der Groeße nach anzeigen und zwei sekunden warten.

while read zeile; do
i=$( /bin/ls -S ???_"`echo "$zeile" |cut -c 3-`" )
a=`echo "$i" | tail -n 2`

read antwort

if [ "$antwort" = "j" ]
then
rm "$a"
fi

sleep 2
done < doppelt.txt



So kommt es bei mir der Option "set -xv" raus:

+ read zeile
/bin/ls -S ???_"`echo "$zeile" |cut -c 3-`"
echo "$zeile" |cut -c 3-
+++ echo '2 AbA Structure - Ebb Tide.mp3'
+++ cut -c 3-
++ /bin/ls -S '007_AbA Structure - Ebb Tide.mp3' '092_AbA Structure - Ebb Tide.mp3'
+ a=092_AbA Structure - Ebb Tide.mp3
007_AbA Structure - Ebb Tide.mp3

Das Problem ist das "a" die beiden Titel enthält - warum auch immer.

Basti_litho
09-02-2004, 10:19
Ok, habs geschnallt :)

bei zwei Dateien zu sagen "tail -n 2" macht irgendwie nicht so viel sinn :D

Aber:

Nun kommt das nächste Problem:

Ich möchte ja nachfragen ob die Datei wirklich gelöscht werden soll.



i=`/bin/ls -S ???_"$z" |tail -n 1`

echo "Wollen Sie die Datei "$i" loeschen?"

read antwort

if [ "$antwort" = "j" ]
then
rm "$i"
fi

Nun nimmt aber "read" als Antwort anscheinend die nächste Datei:


+ i=007_AbA Structure - Ebb Tide.mp3
+ echo 'Wollen Sie die Datei 007_AbA' Structure - Ebb 'Tide.mp3 loeschen?'
Wollen Sie die Datei 007_AbA Structure - Ebb Tide.mp3 loeschen?
+ read antwort
+ '[' '2 Adam Freeland - Apex Bangin.mp3' = j ']'

Kann "read" keine verschachtelung? Oder was mach ich falsch?

Basti_litho
09-02-2004, 10:49
hmm... hab jetzt einfach das nachfragen weggelassen.

so gehts.

Hier nochmal (falls es jemand interessiert), das ganze Ding:


#!/bin/bash

#set -xv

# Erwartet einen Parameter - wie viel vom Anfang des Dateinamens abgeschnitten werden soll.
# Dieser Wert ist folgendermaßen zu ermittlen:

# echo "Meine Datei"|cut -c 5-
# wuerde die ersten fuenf Zeichen abschneiden.

# Aufruf: finddupes 5

# doppelte finden und in /tmp/doppelte.txt speichern

/bin/ls |cut -c 5- |sort |uniq -c -d > /tmp/doppelte.txt



# liste der doppelten Dateien Zeilenweise auslesen und mit ls der Groeße nach anzeigen.


while read zeile; do

# Nummern der Dateinamen abschneiden:

z="`echo "$zeile" |cut -c $1-`"

# kleinere von beiden in i speichern:

i=`/bin/ls -S *"$z" |tail -n 1`

# Nochmaliges Anzeigen der zu Bearbeitenden Dateien:

/bin/ls --color -l -S *"$z"

# Loeschen der kleineren Datei:
echo "$i" wird geloescht

sleep 3

rm "$i"
echo "$i" wurde geloescht

done < /tmp/doppelte.txt