Hi ! Ich versuche ein Bash Skript zum extrahieren von Titel und Interpreten aus mp3 Dateinamen zu schreiben. Das ganze gschieht in einer for Schleife :
for line in $(ls -l $1); do Interpret=${line%%-*.mp3} done
Das ganze funktioniert aber nicht, da in den Dateinamen Leerzeichen vorkommen, und diese von Bash wahrscheinlich als Feldseparatoren interpretiert werden. Wie muss ich an der Stelle quoten damit bash das unterlässt ? Oder gibt es noch bequemere Wege mit Dateinamen als Strings umzugehen?
Johannes Richter
Hi Johannes,
On Wed, Mar 27, 2002 at 13:37:38 +0100, Johannes Richter wrote:
Ich versuche ein Bash Skript zum extrahieren von Titel und Interpreten aus mp3 Dateinamen zu schreiben. Das ganze gschieht in einer for Schleife :
for line in $(ls -l $1); do
Wie Du schon richtig sagst, macht diese Schleife Probleme bei Dateinamen mit Leerzeichen. Ausserdem liefert "ls -l" nicht nur die Liste der Dateinamen, sondern auch Rechte, Link Count, Owner... Also unbrauchbar als Liste fuer die for-Anweisung.
Interpret=${linepp-*.mp3}
^^^^^^^^^^^^^^^ In welcher Manpage hast Du das nachgelesen? Dieses Konstrukt schneidet jedenfalls nicht das Muster "-*.mp3" von linepp ab. Wie es wirklich funktioniert, kannst Du in der bash-Manpage unter "Parameter Expansion" nachlesen. Dich interessieren besonders die Zeichen '#' und '%'.
done
Wie muss ich an der Stelle quoten damit bash das unterlässt ? Oder gibt es noch bequemere Wege mit Dateinamen als Strings umzugehen?
Am besten gar keine Liste verwenden, si dass IFS nicht zum Zuge kommt. Hier ist eine Alternative:
#!/bin/bash ls -1 "$1" | while read linepp do Interpret=${linepp%%-*} echo "Interpret: $Interpret" Song=${linepp##*-} Song=${Song%.mp3} echo "Song: $Song" done
Das Skript nenne ich mal mp3_info. Jetzt ein Test:
$ ls priv/TMP The Trolls-We quote ugly.mp3
$ ./mp3_info priv/TMP Interpret: The Trolls Song: We quote ugly
bye, Chris
On Wed, 27 Mar 2002 13:37:38 +0100, Johannes Richter wrote:
Hi ! Ich versuche ein Bash Skript zum extrahieren von Titel und Interpreten aus mp3 Dateinamen zu schreiben. Das ganze gschieht in einer for Schleife :
for line in $(ls -l $1); do Interpret=${line%%-*.mp3} done
Das ganze funktioniert aber nicht, da in den Dateinamen Leerzeichen vorkommen, und diese von Bash wahrscheinlich als Feldseparatoren interpretiert werden.
Bist du dir bewußt, was for line in $(ls -l $1); alles als $line liefert? Versuchs mal so:
ls -1 "$1" | while read line do Interpret=${line%%-*} echo $Interpret done
Wie muss ich an der Stelle quoten damit bash das unterlässt ? Oder gibt es noch bequemere Wege mit Dateinamen als Strings umzugehen?
Am Quoten liegt es nicht denke ich mal
Reinhard
Am Mittwoch, 27. März 2002 13:37 schrieb Johannes Richter:
Das ganze funktioniert aber nicht, da in den Dateinamen Leerzeichen vorkommen, und diese von Bash wahrscheinlich als Feldseparatoren interpretiert werden. Wie muss ich an der Stelle quoten damit bash das unterlässt ? Oder gibt es noch bequemere Wege mit Dateinamen als Strings umzugehen?
Äh, Thread 'Scriptfrage' vom 21.12.2001 weiter unten. Ich hatte ein ähnliches Problem.
Mit freundlichen Grüßen
Jens Puruckherr
lug-dd@mailman.schlittermann.de