Einlesen von Dateinamen und wechseln der Endung

B

Buchinho

Ich schreibe gerade an einem Skript, dass mir Avi (divx) Dateien umwandelt in Mpeg, damit ich diese auf meiner Linux-PVR-Box schauen kann. Leider komme ich gerade nicht weiter:

Code:
#!/bin/bash
echo $1 | sed 's/avi/mpeg/g' | sed $NEU =
echo $NEU
mencoder "$1" -o $NEU -of mpeg ...

Das Script nimmt immer als Outputfile -of als Dateinamen, obwohl es ja wie oben angegeben ein Mpeg daraus machen soll. Im echo $NEU wird es aber korrekt ausgegeben, komischerweise immer mit einer 1.

Vielleicht könnt ihr mir helfen?
 
Ich schreibe gerade an einem Skript, dass mir Avi (divx) Dateien umwandelt in Mpeg, damit ich diese auf meiner Linux-PVR-Box schauen kann. Leider komme ich gerade nicht weiter:

Code:
#!/bin/bash
echo $1 | sed 's/avi/mpeg/g' | sed $NEU =
echo $NEU
mencoder "$1" -o $NEU -of mpeg ...

Das Script nimmt immer als Outputfile -of als Dateinamen, obwohl es ja wie oben angegeben ein Mpeg daraus machen soll. Im echo $NEU wird es aber korrekt ausgegeben, komischerweise immer mit einer 1.

Vielleicht könnt ihr mir helfen?

Hallo
Was das da oben soll, erschließt sich mir nicht.
Welche Shell du verwendest, sagst du leider auch nicht.

Fakt ist, es ist syntaktisch falsch und wird so nie laufen.
Code:
|sed $NEU =
wird 100 % zu einem Fehler führen.
Leider weiß ich auch nicht, was du damit bezwecken willst.
Deshalb hier nur ein Vorschlag, wie du aus einem Dateinamen foo.avi foo.mpeg machen kannst.
Code:
#wenn $1 den Dateinamen enthält:
# mit bash oder ksh

FILENAME="${1%\.*}.mpeg"
# mit GNU sed
FILENAME=$(echo $1|sed -e 's/avi$/mpeg/gi')

Weiterhin ist es sehr gut, vorher zu testen ob $1 auch als Datei existiert.
Code:
if [ -e "$1" ];
then
...
fi

Das Quoting nie vergessen. Viele finden es cool mit Leerzeichen und anderen Sonderzeichen in Dateinamen umherzuwerfen... bis sie diese dann mal per Skript verarbeiten müssen.
Dann ist meist schluss mit Lustig.

Gruß Wolfgang
 
Super danke, das hat mir schonmal sehr geholfen!
Wie du siehst, benutze ich die BASH.
Wenn ich jetzt das Skript mit mehreren Dateien als Übergabeparameter starte, wie kann ich da eine Schleife bauen, damit der Befehl mencoder mehrfach ausgeführt wird und nicht nur für eine Datei?

Hab noch ein weng dran gebaut, sieht jetzt so aus:

Code:
#!/bin/bash
#Folder where the the newly created mpegs should be saved in
FOLDER="IpboxReady"

#Does the Folder already exist?
if [ ! -e "$FOLDER" ]; then mkdir "$FOLDER"; fi;

#For every single argument given by the user, convert!
for arg in "$@"; do
	if [ -e "$arg" ]; then

		NEWFILENAME="${arg%\.*}.mpeg"

		mencoder "$arg" -o ./"$FOLDER"/"$NEWFILENAME" -of mpeg -ofps 25 -oac lavc -ovc lavc -srate 44100 -lavcopts acodec=mp2:vcodec=mpeg2video:vhq:keyint=25:vbitrate=10000:abitrate=192:scplx_mask=0.2 -vf pp=hb/vb/dr,hqdn3d -vf scale=720:-2,expand=0:576,crop=704:576

	else echo ---- File does not exist! -----------
	fi
	
done
 
Zuletzt bearbeitet von einem Moderator:
Du könntest das script in der Art aufrufen
Code:
for name in $(ls /dir/mit/ausgangsdateien); do dein_script.sh $name ; done

Vorrausgesetzt deine Videodateien haben keine Leerzeichen oder andere Sonderzeichen die du vorher abfangen musst.

Andererseits kannst du die FOR schleife auch direkt in dein script einbauen.
 
Zurück
Oben