Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Batch-Verarbeitung in der Shell

Batch-Verarbeitung in der Shell

Agrajag01.08.0416:26
Ich möchte ein paar Video-Dateien von MOV bzw AVI nach MKV umwandeln lassen. Für einzelne Dateien lautet der Befehl z.B.:
<br>
<br>mkvmerge -o video.mkv --language 1:ger --language 2:eng video.mov
<br>
<br>Wie stelle ich es an, dass ich ein ganzes Verzeichnis auf einen Schlag konvertieren kann. Das ist doch ein Job, der sich doch prima automatisieren lassen müsste, oder?
<br>
<br>Das Problem ist aber, dass ich noch ein Frischling in der Shell bin. Ich benötige auch nicht die komplette Lösung, mir würde es schon reichen, wie es prinzipiell geht und welche Manpages ich mir mal ansehen sollte (mir fehlt da derzeit einfach der Überblick).
<br>
<br>Die nächste Stufe wäre dann, erstmal mit
<br>
<br>mkvmerge -i video.mov
<br>
<br>mir erstmal die Informationen zur Datei ausgeben zu lassen, was z.B. so aussehen kann:
<br>
<br>File &rsquo;/Volumes/Filme/Video.avi&rsquo;: container: AVI
<br>Track ID 0: video (DX50)
<br>Track ID 1: audio (MP3)
<br>Track ID 2: audio (MP3)
<br>
<br>Da interessieren die Anzahl der Tracks und die Track IDs, da sie bei AVI normalerweise bei 0 beginnen und bei MOV 1. Jenachdem müsste der Befehl zur Konvertierung angepasst werden.
<br>
<br>Wie gesagt, ein Verweis auf die Manpages würde schon reichen (oder ein Tipp für ein Tutorial). Irgendwie bin ich zu doof das passende zu ergoogeln
<br>
0

Kommentare

Rantanplan
Rantanplan01.08.0416:29
for f in *.mkv; do mkvmerge -o $f --language 1:ger --language 2:eng ${f%.mkv}.mov; done
<br>
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Rantanplan
Rantanplan01.08.0416:31
Ups, sorry, habe dein Posting nicht genau genug gelesen Von mov nach mkv:
<br>
<br>for f in *.mov; do mkvmerge -o ${f%.mov}.mkv --language 1:ger --language 2:eng $f; done
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Agrajag01.08.0416:49
Hey, Danke Rantanplan für die schnelle Antwort.
<br>
<br>Ich probiere es gerade aus und es klappt -- mit einer klitzekleinen Änderung: ein paar Anführungszeichen, da die Dateinamen auch Leerzeichen haben:
<br>
<br>for f in *.avi; do mkvmerge -o "${f%.avi}.mkv" --language 1:ger --language 2:eng "$f"; done
<br>
<br>An die Shell könnte ich mich wirklich gewöhnen, nur ist der Anfang recht schwer, da sie doch recht eigenwillig/kryptisch ist.
<br>
<br>Kann man da noch einen Mechanismus einbauen, ob etwas fehlgeschlagen ist? Z.B. wenn plötzlich die Platte voll ist oder wenn eine Konvertierung fehlgeschlagen ist, dann wäre es nützlich, wenn ich zumindest gesagt bekäme wieviele Fehler auftauchten. Besser wäre natürlich eine Liste der Dateien, bei denen eine Konvertierung fehlschlug. Es wird viel ausgegeben und da sind fehler schwer auszumachen.
<br>
<br>Ich würd mich nicht wundern, wenn es recht einfach zu machen wäre.
0
Agrajag01.08.0416:59
Achso: das Ergebnis, ob eine Konvertierung erfolgreich war, oder nicht, benötigt man auch, wenn man die Quelldatei anschliessen löschen/verschieben möchte. Damit hätte man auch automatisch die Dateien, bei denen Fehler auftraten.
<br>
<br>mkvmerge kann scheinbar mit einigen MOV-Dateien nichts anfangen.
<br>
<br>Wo kann ich eigenlich etwas über die Varieblenspielerei nachlesen (das mit den &rsquo;f%.avi&rsquo; und so)? Ich hab hier drei Uralt-Unix-Bücher rumstehen (1990-96), aber derartiges ist mir noch nicht aufgefallen. Stichwort?
<br>
0
Rantanplan
Rantanplan01.08.0417:04
Jo, klar, kann man alles machen. Es gibt viele Wege zum Ziel
<br>
<br>Als erstes: mit $? bekommt man den Rückgabewert des letzten ausgeführten Programms. 0 ist normalerweise "alles ok". Man könnte also eine Funktion schreiben:
<br>
<br>function convert () {
<br> mkvmerge -o "$2" --language 1:ger --language 2:eng "$1"
<br> if [ $? -ne 0 ]; then
<br> echo Fehler beim Konvertieren von $1
<br> fi
<br>}
<br>
<br>for f in *.avi; do convert "$f" "${f%.avi}.mkv"; done
<br>
<br>
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Agrajag01.08.0418:26
Hmmm... Bei mir kommt immer "line 6: syntax error near unexpected token `}&rsquo;" -- das ist die Zeile mit dem "echo Fehler beim Konvertieren von $1".
<br>
<br>Wenn ich das if-Konstrukt entferne funktioniert alles, nur mit eben nicht. Ich kann da beim besten Willen keinen Fehler sehen.
0
Rantanplan
Rantanplan01.08.0421:06
Hm. Bei mir funktioniert es. Sind vom Copy&Paste irgendwelche Murkszeichen zurückgeblieben? Deine Shell ist die bash? Mir fällt jetzt auch nix auf....
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Agrajag01.08.0421:40
Jepp, irgendwie war da was im Argen -- jetzt funktioniert es.
<br>
<br>Nächstes Problem: Wie zur Hölle erzeuge ich ein Zeilenwechsel in einem String?!?
<br>
<br>wrongFiles=${wrongFiles}$f"\n"
<br>
<br>tut es nicht.
<br>
<br>Irgendwie finde ich auch nichts darüber. In allen drei Büchern gibt es im Index kein &rsquo;Zeichenketten&rsquo;, &rsquo;Strings&rsquo; oder Sonstiges. Das kann doch nicht sein.
<br>
<br>So sehr mir die Shell ja von ihren Möglichkeiten auch gefällt, aber ihre Programmierbarkeit ist Sch... (sorry, bin leicht gefrustet)
<br>
0
Sven Janssen
Sven Janssen01.08.0421:42
da arbeite ich schon Jahren auf der Shell, aber ${f%.avi}.mkv war mir absolut unbekannt. Meinereiner hat das immer mit awk gelöst Sah natürlich etwas komplizierter aus.
<br>
<br>Dank Dir Rantanplan
<br>
<br>Sven
0
Sven Janssen
Sven Janssen01.08.0421:54
auf der Shell ist das nicht \n sonder ^M also STRG+V und dann M drücken.
<br>geht aber nicht, das echo gibt Dir dann nur den letzen Eintrag aus.
<br>Müsstest das wenn mit einem Array lösen.
<br>
<br>Sven
0
Agrajag01.08.0422:02
Hä? Hab ich das jetzt richtig verstanden? Man kann in der Shell keinen Zeilenwechselzeichen an eine Zeichenkette hängen? Das bräuchte ich aber, damit ich mir (möglichst lesbar) ausgeben, bei welchen Dateien eine Konvertierung fehlschlug.
<br>
0
Agrajag01.08.0422:03
Ach so: Mich würde auch noch interessieren, was es mit "${f%.avi}.mkv" auf sich hat. Wo kann ich mehr darüber lesen (unter welchem Stichwort)?
<br>
0
Sven Janssen
Sven Janssen02.08.0402:08
"${f%.avi}.mkv" gibt aus der Variablen f nur den String ohne .avi zurück und hängt .mkv dran.
<br>
<br>Hilfe dazu unter :
<br>man bash
<br>und http://193.175.22.77/bilders/Netzwerke2002/rbes_bash_skript.html
<br>
<br>Sven
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.