Shell Skripte

Skyshine

Member
Hi Leute, also folgende kurze frage
ab und an möchte ich meine mp4 doch für meinen Stick im Lkw Umwandeln in mp.3
soweit alles klar, habe das bis jetzt da es meist nicht viel ist mit ffmpeg über die Konsole Händisch bewerkstelligt.

Jetzt dachte daran das zu Automatisieren und eben einen Ordner zu erstellen wo ich das Skript und meine Umzuwandelnden Daten in einem rutsch eben machen lasse.
Dazu noch ein Dokument erstelle über die vorhandenen mp4 dateien.

Code:
#!/bin/bash

ls -1 *.mp4 > verzeichniss.txt
ls *.mp4 | while read file
do
ffmpeg -i "$file"  -vn -acodec mp3 -ab 128k $file.mp3
done
soweit funktioniert das auch, ausser das er mit dem Umwandeln nach der ersten datei aufhört und ich hätte nun gern gewußt warum ?

also in die txt datei führt er alles ordenltich auf der Reihe nach aber die Verarbeitung bricht eben nach der ersten datei ab. bzw wird beendet

Danke für eure Tipps, Gruß Sky
 

Rain_Maker

Administrator
Teammitglied
Warum so kompliziert?

Verwende

Code:
for i in AUSDRUCK ; 
     do WAS_AUCH_IMMER "$i" ;
done
und spare Dir temporäre Dateien und die ganze "while read"-Konstruktion.

Greetz,

RM

P.S. Nur so nebenbei, zunächst erzeugst Du mit
Code:
ls -1 *.mp4 > verzeichniss.txt
eine Datei, und dann

Code:
ls *.mp4 | while read file
liest Du sie gar nicht aus (und verwendest auch nicht "-1", was Dir wahrscheinlich zu guter Letzt noch das Auslesen mit read verhagelt), macht also doppelt (oder gar dreifach) keinen Sinn.

Aber davon abgesehen, "for" ist Dein Freund und lass den ganzen anderen Konstrukt einfach weg.
 

Skyshine

Member
danke für die fixe Antwort, aber jetzt mal langsam, hätte evtl dazuschreiben sollen das ich da absoluter Anfänger im Skripten bin und das war ein Beispiel das ich hier eingegeben habe also direkt so wie es hier vor mir steht und ich mir eingebildet habe es verstanden zu haben.

also
Code:
ls -1 *.mp4 > xxxx.txt
erzeugt eine Liste mit allen mp4 Dateien die in dem verzeichniss stehen wo das Skript ausgeführt wird. Soweit denke ich bin ich richtig.
Du hast recht in dem Punkt das ich diese Liste dann nicht auslese, diese diente auch nur zum Zweck zu wissen was ursprünglich in dem Verzeichniss stand und hatte auch nicht funktioniert bzw führte zum gleichen Ergebniss.

ls -1 ändert doch nur die Form der Liste oder irre ich mich?, denn es existiert kein Unterschied ob ich hier
Code:
ls *.mp4
benutze oder
Code:
ls -1 *.mp4
das hatte ich schon so stehen wie gesagt macht aber keinen Unterschied im Ablauf, es wird immer die erste datei gewandelt ansonsten keine. Ich kann mir auch das mal for dann am Wochenende vornehmen aber richtig bleibt doch

Code:
ls -1 *.mp4 | while read file
würde bedeuten

erzeuge eine Temporäre Liste, wandle die Datei die du ausliest um solange bis das Ende der Liste erreicht ist und dann beende das Skript

So hätte ich als Anfänger das Beispiel hier jetzt verstanden was aber auch nicht funktioniert, werde mich aber mal an deine Ausführungen wagen. Danke

So und noch ein kurzes Update von mir:

Code:
#!/bin/bash
for i in *.mp4
do
ffmpeg -i "$i" -ab 128k "${i%mp4}mp3"
done
ist klar funktioniert danke nochmal RM, aber ich werde mit dieser read Geschichte aus dem Buch hier nochmal rumexperimentieren weil ich nicht verstehe was ich hier falsch mache :D aber ich fang ja auch grad an mit skripten und ist hier auch nicht schön beschrieben in dem Beispiel: read zum Zeilenweisen auslesen einer datei oder eines verzeichnis.

Habe mich nochmal damit hingesetzt und natürlich bin ich immernoch damit auf dem Holzweg ;(
aber vielleicht kann Rain_Maker mir auch kurz mal erklären warum hier überhaupt der andere Weg besser ist und oder wo bei mir auch der Wurm liegen könnte denn machen könnte man es über read ja anscheinend auch sonst hätten dies ja auch nicht hinbekommen ?(
Code:
!/bin/bash
ls -1 *.mp4 > Liste
= leite die ls ausgabe statt in die Konsole in die Datei Liste
Code:
while read Liste
= während du die datei Liste liest
Code:
do
= tue folgendes
Code:
ffmpeg -i $Liste -ab 128k ${Liste%mp4}mp3
wandle sämtliche einträge aus dieser liste von mp4 in mp3
Code:
done < Liste
= ist die Liste abgearbeitet dann beende das Skript
 
Oben