Shell Script Replace Fehler

Adronik

Cadet 4th Year
Registriert
Sep. 2004
Beiträge
124
Hallo zusammen,

ich hab ein Problem bei einem script zum Video encoding aber hier erstmal das script:
Code:
clear
IFS=$'\n'

for i in */*/*.mp4; do

	/home/user/ffmpeg-git-20161102-64bit-static/./ffmpeg -threads 0 -i "$i" -vcodec hevc -preset veryslow -acodec aac -aq 10 ${i/.mp4}_encode.mp4
	sleep 1

done

for i in */*/*.wmv; do

	/home/user/ffmpeg-git-20161102-64bit-static/./ffmpeg -threads 0 -i "$i" -vcodec hevc -preset veryslow -acodec aac -aq 10 ${i/.wmv}_encode.mp4
	sleep 1

done

Die erst for Schleife läuft ohne Fehler durch und ersetzt mir die Dateiendung wie gewünscht. "Order/Order/video.mp4 -> Order/Order/video_encode.mp4".
Aber bei der zweiten for Schleife ersetzt er nicht die Dateiendung sondern mach das "Order/Order/video.wmv -> Order/Order/video.wmv_encode.mp4" Warum ist das so?
Selbst bei einer for Schleife nur mit Ersetzen

Code:
for i in */*/*.wmv; do

	${i/.wmv}_encode.mp4

done

kommt die Fehlermeldung "Datei oder Verzeichnis nicht gefunden".

Ich hoffe Ihr könnt mir das Problem erklären.

Das habe ich beim suchen gefunden konnte mir aber nicht sehr viel weiter helfen.
http://www.gutefrage.net/frage/shell-script-string-replace-bad-substitution

Vielen Danke schon mal im voraus.:)
mfg adronik
 
Ich bin kein Bashprofi, aber wenn ich das richtig verstehe machst du Gebrauch von String-Replacement mittels
Code:
${string/substring/replacement}
, wobei replacement in deinem Fall eben ein leerer String ist.

Versuch stattdessen doch mal
Code:
${string%substring}
(löscht das Auftreten substring am Ende des Strings).

Das erklärt aber natürlich auch nicht, wieso die erste Schleife für sich funktioniert, die zweite aber nicht. Vielleicht kann dir da jemand anders weiterhelfen.

Zu deinem Testskript: Das kann so nicht funktionieren, weil du lediglich den Dateinamen zusammen baust und dann nichts damit machst. Die Shell versucht, diese Datei zu finden um sie auszuführen, aber sie existiert ja noch gar nicht. Schreib zum Testen mal ein echo davor (oder wenn du schon fertig konvertiert hast und nur noch verschieben willst, dann eben ein mv mit altem und neuem Namen).
 
Danke aber leider lag der Fehler im Detail ich hatte in einem Ordnernamen ein .wmv drin und das hat den Fehler beim ersetzen verursacht. Er hat den string im Ordnernamen ersetzt und nicht den im Dateinamen deshalb die Fehlermeldung "Datei oder Verzeichnis nicht gefunden".

mfg adronik
 
Das sind die tollsten Fehler.;) Zum Glück ist ein umbenannter Ordner noch relativ auffällig. Für ähnliche Fehler habe ich schon tageweise debuggt.
Falls du nochmal vor so einer Situation landest, kannst du
Code:
${string/%substring/replacement}
versuchen, also mit %-Zeichen. Das ersetzt nur, wenn der Substring am Ende auftritt, in deinem Fall also in der Dateiendung und nicht in vorherigen Ordnerebenen.

Nur fürs Verständnis: Deine Testschleife sollte aber immernoch fehlschlagen, oder? Wie gesagt machst du da nichts mit den erzeugten Dateinamen, so dass die Bash nichts damit anfangen können dürfte.
 
Zurück
Oben