ubuntuusers.de

shell-script, um für mehrere ordner m3u listen zu erstellen

Status: Ungelöst | Ubuntu-Version: Ubuntu
Antworten |

Lenny25

Anmeldungsdatum:
17. März 2007

Beiträge: Zähle...

Hallo erstmal.

Ich fange so langsam an, mich mit Linux anzufreunden.
Habe einen kleinen Server(NSLU2) gekauft, openSlug installiert, mp3 player draufgehauen....is zwar viel arbeit, sich alles anzueignen...man hat aber irgendwie was von....egal, kommen wir zum eigentlichen Thema. -.-'

Problem: mein portabler MP3-Player Rio Carbon kann keine Verzeichnis-Struktur lesen.
angestrebte Lösung: für jedes Verzeichnis meiner mp3-Sammlung eine m3u-playlist erstellen lassen.

für ein Verzeichnis ist es ganz einfach: ls *.mp3 > playlist.m3u

ich denke, mit den Befehlen find und sed könnte das ganze funktionieren.....mehere verzeichnisse autom. zu bearb.

hab leider nur pascal-kenntnisse....

var
aktuelle_line:string; // hier wird der ordner-name gespeichert
line1pos,line2pos:integer; /hier werden die Positionen gespeichert, wo letzte/zweitletzte "/" auftreten

find *.mp3 // damit hat man die ganze verzeichnis-Struktur....

sed ...finde letzten "/" in der LINE ->line1pos // ich kann mir vorstellen, dass die 3 Zeilen in eine gepackt werden können....blos wie?
sed ...finde zweitletzte "/" in der LINE ->line2pos
aktuelle_line= STRING zwischen line1pos und line2pos

LINE ab line1pos → "LINE bis line1_pos"/aktuelle_line.m3u //wenn diese zeile "extra" stehen muss, sind die variablen auf jeden fall notwendig

kann mir das jemand "übersetzen"?

sehr gespannt auf die Lösung ist....gruß, Lenny 😀

MrDoubtfire

Anmeldungsdatum:
18. Oktober 2005

Beiträge: 210

Hallo Lenny25,

ist zwar kein Pascal, aber vielleicht das, was Du suchst:

#!/bin/bash
INPUTDIR="$1"
cd "$INPUTDIR"
INPUTDIR="$PWD"
cd "$OLDPWD"
filedir=""
OLDIFS="$IFS"
IFS=$'\n'
for filepath in $(find $INPUTDIR -type f -name '*.mp3' -print | sort); do
  IFS="$OLDIFS"
  oldfiledir="$filedir"
  filedir="$(dirname "$filepath")"
  filename="$(basename "$filepath")"
  if [ "$oldfiledir" = "$filedir" ]; then
    echo $filedir/$filename >> "$(echo $filedir | awk -F/ '{ print $(NF-1) " - " $NF }').m3u"
  else
    rm -f "$(echo $filedir | awk -F/ '{ print $(NF-1) " - " $NF }').m3u"
    echo $filedir/$filename > "$(echo $filedir | awk -F/ '{ print $(NF-1) " - " $NF }').m3u"
  fi
done
exit

Speicher Dir das BASH-Script irgendwo hin und ruf' es über die Konsole auf. Es wird ein Parameter (= Wurzel-Verzeichnis Deiner Musiksammlung) erwartet.

MrDoubtfire

Lenny25

(Themenstarter)

Anmeldungsdatum:
17. März 2007

Beiträge: 14

Hallo MrDouptFire,

die Lösung sieht schon ganz gut aus. Leider funktioniert sie nicht ganz.

Ich habe ein wenig mit deinem Code herumgespielt.

Wenn ich Ihn einfach aufrufe, kommt folgendes:

# sh makem3u /media/sdb1/daten/_mp3/_einzeln/

find: /media/sdb1/date: No such file or directory
find: /_mp3/_ei: No such file or directory
find: zel: No such file or directory

Wenn ich die IFS-Kommandos wegnehme, dann funktioniert das find, aber der kommt dann halt mit den Lehrzeichen nicht klar.

wie kann ich denn einen String bearbeiten? also darin suchen und kopieren/ersetzen etc. .... dann muesste man die fertigen $FILEPATH vielleicht nicht benutzen....

gruß, Lenny

MrDoubtfire

Anmeldungsdatum:
18. Oktober 2005

Beiträge: 210

Hallo Lenny,

hmh, bei mir läuft das Script ohne Fehler ... 😮 😮

Versuch doch mal folgenden Aufruf:

./makem3u /media/sdb1/daten/_mp3/_einzeln/


oder:

./makem3u "/media/sdb1/daten/_mp3/_einzeln/"

MrDoubtfire

Lenny25

(Themenstarter)

Anmeldungsdatum:
17. März 2007

Beiträge: 14

hm.

also ich glaube, es liegt daran, dass ich das script nicht auf nem ubuntu-linux laufen lasse, sondern auf auf der NSLU2 mit openslug 3.1 beta.

bei dem aufruf kommt das gleiche, wie wenn ich ich makem3u ohne "sh" aufrufe:

-sh: ./makem3u: not found bei /.makem3u

-sh: makem3u: not found bei makem3u

....?!??!?

gruß

MrDoubtfire

Anmeldungsdatum:
18. Oktober 2005

Beiträge: 210

Hallo Lenny,

und das Script hat auch Ausführungsrechte (chmod +x makem3u) ?

Ich wüsste keinen Grund, warum das Script auf dem Server nicht laufen sollte (openslug ist doch ein LINUX-/UNIX-System mit einem BASH-Interpreter, oder ?).
Alternativ würde ich eine Netzwerkfreigabe des Ordners mit Deinen MP3-Dateien für Deinen Ubuntu- oder anderen LINUX-PC einrichten.

MrDoubtfire

Lenny25

(Themenstarter)

Anmeldungsdatum:
17. März 2007

Beiträge: 14

hi MrDouptfire

MrDoubtfire hat geschrieben:

Ich wüsste keinen Grund, warum das Script auf dem Server nicht laufen sollte (openslug ist doch ein LINUX-/UNIX-System mit einem BASH-Interpreter, oder ?).
MrDoubtfire

HA! das ist es !!! Hab keinen Bash-Interpreter.

Mir ist heute beim ruminstallieren von verschiedenen programmen erst aufgegangen, was die erste Zeile genau bedeutet!

als mirs klar wurde, wollte mal wieder ein bin-file nicht laufen....hab dann mal aus verzweiflung mit vi das file geöffnet....und da stand schon wieder so ein #!/bin/perl ..... und bei mir liegt die perl-file in /usr/bin !

also am anfang versteht man nur bahnhof bei linux...aber wenn man hartnäckig dranbleibt, versteht man plötzlich sehr schnell und viel! ;→

werde mir den bash-interp. installieren, dann muesste auch das script funken.

danke Dir, gruß, Lenny

Lenny25

(Themenstarter)

Anmeldungsdatum:
17. März 2007

Beiträge: 14

Hey MrDouptfire.

Hab den Bash installiert.
Dann hab ich noch dein Code etwas verändert.

Der von mir veränderte Code speichert die m3u's jetzt in jedem Ordner und schreibt in die m3u nur die DateiNamen ohne Pfadangaben.
(Is wichtig, da mein mp3-player ja mit den pfadangaben nichts anfangen kann)

#!/bin/bash
INPUTDIR="$1"
cd "$INPUTDIR"
INPUTDIR="$PWD"
cd "$OLDPWD"
filedir=""
OLDIFS="$IFS"
IFS=$'\n'
for filepath in $(find $INPUTDIR -type f -name '*.mp3' -print | sort); do
  IFS="$OLDIFS"
  oldfiledir="$filedir"
  filedir="$(dirname "$filepath")"
  filename="$(basename "$filepath")"
  if [ "$oldfiledir" = "$filedir" ]; then
    echo $filename >> "$filedir/$(echo $filedir | awk -F/ '{ print $(NF-1) " - " $NF }').m3u"
       else
         rm -f "$filedir/$(echo $filedir | awk -F/ '{ print $(NF-1) " - " $NF }').m3u"
        echo $filename > "$filedir/$(echo $filedir | awk -F/ '{ print $(NF-1) " - " $NF }').m3u"
  fi
done
exit

gruß, Lenny

DerSchuhverkäufer

Avatar von DerSchuhverkäufer

Anmeldungsdatum:
17. Dezember 2006

Beiträge: 229

Wohnort: /home/sweet home

@lenny25:

Das Skript ist der Hammer. So klein und so effektiv. Ganau das hab' ich gesucht. Einfach ausführen und es werden perfekte m3u's erstellt. Danke.

Bordi Team-Icon

Avatar von Bordi

Anmeldungsdatum:
5. März 2006

Beiträge: 4549

Wohnort: Erlinsbach, SO (CH)

Jo, wirklich geiler script. 👍 Hier noch der remover dazu.

1
2
3
4
#!/bin/bash
INPUTDIR="$1"
find $INPUTDIR -type f -name '*.m3u' -delete
exit

march Team-Icon

Avatar von march

Anmeldungsdatum:
12. Juni 2005

Beiträge: 17367

Wohnort: /home/noise

Danke. ☺

KarstenW.

Avatar von KarstenW.

Anmeldungsdatum:
27. Juni 2011

Beiträge: 208

Erstmal danke für das tolle Script, auch wenn der Thread schon etwas veraltet ist. Bin gerade beim googlen darauf gestoßen. Ich würde jedoch gerne etwas ändern. Mir wäre es lieber wenn ich einen Namen für die Playliste selber festlegen könnte, entweder durch entsprechendes ändern einer Zeile im Script oder das ganze mit einer read Anweisung per Variable übergeben. Vielleicht kann mir jemand den entscheidenden Tip geben wo im Script der Name für die Ausgabedatei (Playliste) festgelegt wird. Dann könnte ich mir das passend für meine Zwecke ändern.

Gruß Karsten

DerSchuhverkäufer

Avatar von DerSchuhverkäufer

Anmeldungsdatum:
17. Dezember 2006

Beiträge: 229

Wohnort: /home/sweet home

Ich denke mal, das ist die viertletzte bzw. siebtletzte Zeile, und zwar $filename und $inputdir. Auf diese Weise wird der Verzeichnisname als Dateiname übernommen. Aber mal ehrlich: Kleine Änderungen am Dateinamen kann ich auch von Hand vornehmen. Die größte Arbeit, nämlich viele lange Dateinamen von Hand in eine neue Datei zu schreiben, nimmt mir das Script ab. Und wenn das Verzeichnis "Tolle Band - Tolles Album" heißt, heißt auch die Datei so. Und das ist genau richtig.

Steev

Anmeldungsdatum:
5. September 2006

Beiträge: 2237

Wie müsste das Skript aussehen, wenn die m3u nur nach dem Albumordner benannt werden soll und nicht noch zusätzlich vorweg den Überordner im Namen? Bei mir ergibt das Skript: "Überordner - Albumordner.m3u". Ich möchte aber nur "Albumordner.m3u"

Antworten |