Zeichenketten in Shellvariablen ersetzen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
Maunzekater
Beiträge: 4
Registriert: 27.11.2004 23:15:35

Zeichenketten in Shellvariablen ersetzen

Beitrag von Maunzekater » 31.07.2006 18:14:39

Hallo zusammen!

Ich habe eine grundsätzliche Frage zu einem Shellskript, dass ich mir geschrieben habe.
Es soll alle mp3-Dateien in dem aktuellen Verzeichnis schneiden, und zwar auf die ersten 20 Sekunden.
Man ahnt es schon: das soll eine Art Hörprobe werden :D

Die geschnittenen Dateien sollen dann später noch auf eine sehr niedrige Bitrate umkodiert werden - da lame eine andere Ausgabe- als Eingabedatei verlangt, müssen die geschnittenen Dateien also umbenannt werden. Da die geschnittenen Dateien nach dem ganzen Vorgang sowieso gelöscht werden, möchte ich einfach die Endung "mp3" durch "split" ersetzen.

So weit, so gut. Ich habe dann ein wenig Tante Google befragt und in einige Howtos gelesen, dabei bin ich auf diese Lösung gestossen:

Wenn ich eine Variable FILE habe, kann ich das letzte Vorkommen der Zeichenkette mp3 in der Variablen durch die Zeichenkette split ersetzen durch

Code: Alles auswählen

${FILE/%mp3/split}
Lasse ich mir alle Dateien im Verzeichnis mit diesem kleinen Testskript

Code: Alles auswählen

ls *.mp3 | while read FILE
do
   echo "${FILE}  --->   ${FILE/%mp3/split}"
done
ausgeben, stimmt alles wunderbar, die Ausgabe ist dann in etwa so:

Code: Alles auswählen

01-abc.mp3  --->   01-abc.split
02-def.mp3  --->   02-def.split
usw.



Sobald ich aber die echo-Zeile durch das was ich wirklich machen will (schneiden) ersetze, nämlich

Code: Alles auswählen

mp3splt "${FILE} 0.0 0.20 -o ${FILE/%mp3/split}"
dann wird nicht mp3 durch split ersetzt, sondern VOR der Endung eingefügt. Die Dateien heissen dann

Code: Alles auswählen

01-abc.split.mp3
02-def.split.mp3
usw.

Warum ist das so bzw. wo liegt mein Fehler? Im Prinzip ist das doch die gleiche Ersetzung wie beim echo...

Ich habe hier im Forum einige Möglichkeiten gesehen, wie man die Dateien dann einfach umbenennen könnte, das würde aber noch mehr Zeit kosten (es sind viiieeele mp3s). Mit sed würde das wohl auch gehen, aber ich würde es vorziehen, das Problem so zu lösen. Es muss doch gehen! :lol:

(Für nicht-bash-User: Das ganze soll laut meiner Quelle übrigens bash-spezifisch sein)

Mit der Bitte um helfende Aufklärung,
Maunzekater

Leo
Beiträge: 24
Registriert: 10.10.2005 19:40:55

Beitrag von Leo » 31.07.2006 18:32:57


Maunzekater
Beiträge: 4
Registriert: 27.11.2004 23:15:35

Beitrag von Maunzekater » 31.07.2006 18:41:08

Leo hat geschrieben:Schau mal hier: http://mp3splt.sourceforge.net/mp3splt_ ... .html#lbAF.

MfG,
Leo
Hallo Leo,

sieht so wie die Manpage auf meine Shell aus :D

Genau so, wie es dort ganz oben steht, so möchte ich das auch machen:

Code: Alles auswählen

mp3splt album.mp3 54.32.19 67.32 ausgabe.mp3
Nur, dass ich
a) noch die Zeitmarken (min.sek) 0.0 und 0.20 gesetzt habe, Das funktioniert auch soweit

b) mit -o die Ausgabedatei angeben möchte (sonst werden vor die Endung die Zeitmarken gesetzt , das sieht furchtbar aus),

Punkt b klappt nicht, da -was ich nicht verstehe- scheinbar etwas mit der Zeichenkettenersetzung nicht stimmt.

Ich probiere das später noch mal aus, erstmal in die noch-Sonne :)

Gruss, Maunzekater

Leo
Beiträge: 24
Registriert: 10.10.2005 19:40:55

Beitrag von Leo » 31.07.2006 18:51:22

Das ohne -o die Zeitmarken mit in den Dateinamen kommen wußte ich nicht. Aber mit -o wird eben automatisch .mp3 angehängt. Wird dir nichts anderes übrig bleiben als die Ausgabedatei danach umzubenennen.

MfG,
Leo

Hummel
Beiträge: 15
Registriert: 31.07.2006 18:12:49
Wohnort: SH

Beitrag von Hummel » 31.07.2006 20:41:24

Moin Maunzekater,

das Problem liegt nicht an Deinem Skripting, sondern vielmehr an mp3splt.

Offensichtlich hängt es immer '.mp3' an den Dateinamen an, ganz gleich, was man anstellt.
Die Shellzeichenkettenersetzung wird offensichtlich ausgeführt.

Auch wenn man ohne die Zeichenkettenersetzung mit einem vorgegebenen Dateinamen arbeitet wie z. B. 'mp3splt test1.mp3 0.0 0.20 -o huhu', so erhält man eine Datei mit Namen 'huhu.mp3'.

Somit bleibt Dir nur, die Dateien nach der Erstellung umzubenennen. Am einfachsten fügst Du in Dein Schleifenkonstrukt also noch ein entsprechendes "mv" mit ein.

Gruß

Hummel

Methusalix

Zeichenketten in Shellvariablen ersetzen

Beitrag von Methusalix » 01.08.2006 01:22:57

Hallo,

ich habe von mp3splt keine Ahnung, deswegen kann ich dazu auch nichts
sagen. Wenn sich das aber nicht, wie von Dir gewünscht lösen läßt, dann bietet
sich halt (wie Du selber vermutet hast ) sed als Alternative an.

Code: Alles auswählen

matthias@debbi:~/test$ ls
01-abc.split.mp3  02-def.split.mp3
matthias@debbi:~/test$ for x in *; do mv $x `echo $x | sed 's/split\.mp3/split/g'` ; done
matthias@debbi:~/test$ ls
01-abc.split  02-def.split
Gruß
Matthias

Antworten