• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Rename von Dateinamen aus Shellskript heraus?

Hallo,

folgende Ausgangssituation: Ich habe eine Vielzahl von mp3-Ordnern
in welchen die Audiofiles selbst in folgendem Dateiformat abgelegt sind.

Songtitel.mp3

z.B.
Das Intro.mp3
Der Zweite Song.mp3

Logischerweise werden die Songs in den Ordnern nach dem Alphabet
sortiert, da keine Songnummern vorranstehen. Dazu liegt in jedem
Ordner eine m3u Playlist, die die korrekte Reihenfolge der Songs enthält.

Ich habe erfolgreich ein Shellskript geschrieben, dass mir aus der
m3u Datei die Dateinamen ausließt und mir Tracknamen mit Track-
nummern (mit führender Null) generiert, so dass die Dateien z.B.
folgendermaßen umbenannt werden.

Code:
ich@localhost:~/test> ls *.mp3

A Life in the Day of Benjamin Andre.mp3
Behold a Lady.mp3
Dracula's wedding (feat. Kelis).mp3
God (Interlude).mp3
Good Day, good Sir.mp3
...

ich@localhost:~/test> ./run

Alter Name: The Love Below (Intro).mp3
Neuer Name: 01-The Love Below (Intro).mp3
Alter Name: Love Hater.mp3
Neuer Name: 02-Love Hater.mp3
Alter Name: God (Interlude).mp3
Neuer Name: 03-God (Interlude).mp3
Alter Name: Happy Valentine's Day.mp3
...

Das generieren der Namen funktioniert super. Aus der Playlistdatei wird
Zeile für Zeile jeweils ein Track (somit in richtiger Reihenfolge) aus-
gelesen und der erwünschte Dateiname für die Audiodatei erstellt.
Das Problem sind die Leerzeichen in den Dateinamen, die bei einem
mv folgendermaßen angegeben werden müssen (Datei z.B. Hallo
Welt.mp3):

Code:
 mv Hallo/ Welt.mp3 01-Hallo/ Welt.mp3

Somit funktioniert zwar das generieren der Dateinamen super aber
das Umbenennen gibt eben Fehlermeldungen aus, da ich innerhalb
des Skripts keine Slashes in den Namen habe, aber für den konkreten
Umbenenn-Befehl diese brauche.

Der Skriptcode:

Code:
#!/bin/sh

# Wieviele Einträge stehen in der m3u Liste?
anz=$(grep -c .mp3 *.m3u) 
count=1

# Durchgehen und Tracknamen n generieren ( n = count )
while [ $count -le $anz ]
      do

	# Führende Null in Tracknummer einfügen
	if [ $count -lt 10 ]; then
		trackno=0$count
	else
		trackno=$count
	fi
	# Führende Null in Tracknummer eingefügt

	# Tracktitel n auslesen	
	title=$(grep .mp3 *.m3u | head -n $count | tail -n 1)
	
	# Ausgeben des alten und neuen Tracknamens
	echo Alter Name: $title
	echo Neuer Name: $trackno-$title
	
	# Umbenennen der Datei n
	mv $title $trackno-$title

	# Hochzählen um mit Datei n+1 fortzufahren
	count=$[$count+1]  #Zähler um eins erhöhen   

# Läuft solange bis die in Zeile 4 ermittelte Trackanzahl erreicht ist
done
exit 0

Meine Fragen:

* Wie kann ich in eine Variable in dem Shellskript ein Leerzeichen mit
einem "\ " vertauschen? Manuell funktioniert dass dann.

Habs mit
Code:
 title=${title/ // }
probiert, aber da ersetzt
er nur das erste Leerzeichen korrekt.

* Oder gibt es einen Befehl zum umbennenen, wo ich diese Slashes
nicht machen muss?

Vielen, vielen Dank im Vorraus.
 
Wenn man Variablen mit "" zusammenpackt bleiben sie zusammen.

title="$(grep .mp3 *.m3u | head -n $count | tail -n 1"

mv "$title" "$trackno-$title"

Haveaniceday
 

regexer

Advanced Hacker
waltermattau schrieb:
* Wie kann ich in eine Variable in dem Shellskript ein Leerzeichen mit
einem "\ " vertauschen? Manuell funktioniert dass dann.

Habs mit
Code:
 title=${title/ // }
probiert, aber da ersetzt
er nur das erste Leerzeichen korrekt.
Die Lösung hierzu lautet:
Code:
title=${title// /\\ }
Bitte beachten: Es müssen Backslashes eingefügt werden, nicht Slashes.

* Oder gibt es einen Befehl zum umbennenen, wo ich diese Slashes nicht machen muss?
Siehe Beitrag von haveaniceday. So würde ich es auch machen. Das ist nicht so umständlich ;)
 
OP
W

waltermattau

Newbie
Sorry, dass ich mich nicht mehr gemeldet habe. Das Thema ist zwar nicht
wirklich [solved] aber ich habe es jetzt mittlerweile eben manuell gemacht.
Es hat in der Tat auch nicht so sehr lange gedauert wie ich dachte. Das
Skript so far hat mich mehr Zeit gekostet :D

Nur zur Info: Eure beiden Lösungen hatten leider nicht funktioniert. Bei
haveanicedays Lösung hatte ich immer noch das Backslash - Problem und
notoxp's Lösung hatte ich sogar noch selbst herausgefunden aber da hat
er beim Umbennen immer noch einen Fehler angezeigt ganz am Ende
des Dateinamens. Soweit ich mich erinner, konnte er die Datei trotz
eingefügten Slashes nicht finden.
 
waltermattau schrieb:
Nur zur Info: Eure beiden Lösungen hatten leider nicht funktioniert. Bei
haveanicedays Lösung hatte ich immer noch das Backslash

Hmm, eigentlich sind bei der Klammerung mit " .... " die Leerzeichen weiter
da. Wo ist da ein Backslash" Problem ?

Für die Zunkunft: mit "set -x" in der 2.ten Zeile sieht man danach was
das Skript ersetzt und aus den Befehlen macht.

Haveaniceday
 
OP
W

waltermattau

Newbie
Ja, die Leerzeichen verschwanden auch vorher nicht. Das Problem ist ja
eher folgendes.

Du hast eine Datei:

Hallo Welt.txt

Wenn du dir da per Skript den Namen einließt, steht in einer beliebigen
Variable dann:

Hallo Welt.txt

Jeder Befehl (grep, ls, dir) liefert dir ganz normal den Namen.
Wenn ich die Datei umbenennen will über die Konsole muss ich aber

rename Hallo\ Welt.txt Hallo\ Welt2.txt Hallo\ Welt.txt
mv Hallo\ Welt.txt Hallo\ Welt2.txt

eingeben. Ich muss also immer ein Leerzeichen mit einem Backslash/Leerzeichen ersetzen. Das ist mein Problem.

Und mit notoxp's Lösung klappt es zwar die Leerzeichen durch Slashes
zu ersetzen aber eben trotzdem nicht der Rename. Zumal man dann
auch aufpassen muss, dass innerhalb des Konsolenrenames auch vor
jedes Sonderzeichen im Dateinamen ein Backslash muss. Z.B. bei ( oder ) oder so....
 
Versuch doch mal:
mv "Hallo Welt.txt" "Hallo Welt2.txt"

mv benötigt 2 Argumente. Durch "beliebigertext,aber ohne" bleibt es
für z.B. mv ein String. Einen Backslash benötigt man nur wenn man
das ganze ohne " machen möchte.

Ich möchte mal behaupten mein Vorschlag geht problemlos!
 
Oben