• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] etwas Hilfe für meine erste Shell Programmierung

Mr.Tito

Member
Hallo alle,

ich könnt etwas Hilfe gebrauchen. Ich habe ein Verzeichnis mit aufgenommenen (Fernseh-)Sendungen. Eine Sendung besteht i.d.R. aus mehreren Dateien, die immer ein GB groß sind. Eine vollständige Sendung besteht z.B. aus 4 Dateien und sieht dann so aus:
meineSendung.ts
meineSendung.ts.001
meineSendung.ts.002
meineSendung.ts.003

Mit "cat meineSendung.ts meineSendung.ts.001 ... > ZielSendung.ts" kann ich die Dateien zu einem Film zusammen basteln.

Mein Skript findet schonmal alle erste Dateien. Dazu bräuchte ich jetzt die folgenden Dateien in der richtigen Reihenfolge und würde sie dann mit cat mergen.

Hier der erste Anfang meines Anfängerskripts:
Code:
#!/bin/sh
VERZEICHNIS=/mnt/usb/sendungen
for f in $(find $VERZEICHNIS -name *.ts);do
   echo $f
done

Ich würde jetzt gern feststellen, ob es zugehörige Dateien *.ts.001 ff gibt und in diesem Fall mergen und anschließend alle überflüssigen GB-Dateien löschen.

Ich brauche keine lauffähige Lösung für meine Spielerei, aber alle Tipps und HInweise sind sehr willkommen!

Danke schonmal
 

marce

Guru
Such per Script einfach mal nach $f.*

... das das noch sortieren lassen (damit die Reihenfolge stimmt) und zusammenpappen...
 
OP
M

Mr.Tito

Member
danke für die schnelle Hilfe!

Ich habe jetzt zwei ineinander verschachtelte find's gebastelt. Wenn ich das richtig verstehe, funktioniert das so nicht, weil in -name $f nun nicht nur der Dateiname, sondern der komplette Pfad drin steht.

Ich könnte noch weitere Hilfe gebrauchen :/

Wie macht man also üblicherweise weiter? Die Denkweise der Shell-Programmierung ist mir noch etwas fremd...
 
A

Anonymous

Gast
Mr.Tito schrieb:
Ich habe jetzt zwei ineinander verschachtelte find's gebastelt. Wenn ich das richtig verstehe, funktioniert das so nicht, weil in -name $f nun nicht nur der Dateiname, sondern der komplette Pfad drin steht.
suchen war hier anders gemeint

Code:
#!/bin/sh
VERZEICHNIS=/mnt/usb/sendungen
for f in $(find $VERZEICHNIS -name *.ts);do
   echo $f
   ls $f.*
done
das sollte dir die Dateien sogar schon in der richtigen Reihenfolge anzeigen.
somit könntest du an dieser Stelle wahrscheinlich sogar auch sofort benutzen können.
Code:
cat $f.*

Vorsicht: du musst hier einige Sicherungen einbauen sowohl beim VERZEICHNIS als auch bei f , insbesondere gegen LEERZEICHEN.

Wenn du mit bash Dateinamen in Path, Namen und Extension trennen/zerlegen willst/musst, siehe die Manpages bzw die Infopages der Befehle basename und dirname an. Alternativ sed und Reguläre Ausdrücke, bzw auch sehr gut möglich Manpage von bash Abschnitt Parameter Expansion


robi
 
OP
M

Mr.Tito

Member
Danke Euch! Da habe ich ja was zu basteln.

abgdf schrieb:
Damit wirst Du, glaube ich, nicht glücklich.
Irgendwo hatte ich gelesen, dass "cat" für meine Filmchen geeignet wäre. Das hatte ich manuell auch mal ausprobiert und mir ist nichts schlechtes aufgefallen. Mit ffmpeg hätte ich jetzt (ohne tiefer einzusteigen) die Sorge, dass da wieder etwas konvertiert wird, was ja nicht nötig ist. Da der Aufwand aber ja etwa derselbe ist, wenn ich das genannte Skript benutze, werde ich es zumindest mal testen.

Ich berichte in den nächsten Tagen mal wieder.
 

josef-wien

Ultimate Guru
Ich nehme an, Deine Aufnahmen stammen von einem Rekorder. Wenn der Rekorder dasselbe macht, was bei der Erstellung einer DVD passiert, nämlich nach genau 1 GiB eine neue Datei zu beginnen, dann ist cat das richtige Mittel.
 
OP
M

Mr.Tito

Member
Hallo Josef,
genau, die Aufnahmen stammen von einer Dreambox. Die kann ich zwar auch auf größere Dateien einstellen, aber ich habe eine Menge Altlasten, die ich jetzt zusammenfügen möchte. Ich teste auf jeden Fall erstmal mit cat weiter.
Danke
 

abgdf

Guru
josef-wien schrieb:
Ich nehme an, Deine Aufnahmen stammen von einem Rekorder. Wenn der Rekorder dasselbe macht, was bei der Erstellung einer DVD passiert, nämlich nach genau 1 GiB eine neue Datei zu beginnen, dann ist cat das richtige Mittel.
Schwer zu sagen, scheint umstritten zu sein, z.B. hier
Is it possible to merge video files using `cat`?
BЈовић schrieb:
No, it is not possible, because every video file has a header. To merge videos you need to use a tool (like for example ffmpeg or mencoder).
Ich gebe zu, bei mir ging es auch manchmal mit cat, aber ich würde es trotzdem nicht empfehlen, weil das mit dem Header Glückssache sein kann. Kann dann auch passieren, daß der eine DVD-Player das abspielen kann und der andere nicht.
Insofern halte ich ffmpeg immer noch für sicherer. Und da gibt es ja auch extra das "concat protocol", das auch auf Datenebene arbeitet. Eine Videosammlung von ca. 1 TB schrottig zusammengekitteten Dateien (die man im Zweifelsfall auch nicht wieder auseinanderkriegt) wäre doch blöd, oder? Sollte man schon mal ein paar Minuten darauf verwenden, an dieser Stelle eine richtige Entscheidung zu treffen.
 

josef-wien

Ultimate Guru
josef-wien schrieb:
Wenn der Rekorder dasselbe macht, was bei der Erstellung einer DVD passiert, nämlich nach genau 1 GiB eine neue Datei zu beginnen, dann ...
... entspricht mit cat die Dateigröße der Summe der Einzeldateien. Mit ffmpeg ist die Dateigröße um mehr als 1 Prozent kleiner, das Original wird also verändert.

Wenn ich mit ProjectX die Ergebnisse von cat und ffmpeg jeweils in Bild und Ton zerlege, sind diese Dateien identisch. Bei der mit cat erstellten Datei läuft ProjectX fehlerfrei durch, bei der mit ffmpeg erstellten Datei werden drei Fehler angemerkt:
Code:
!> GOP# 292 has no PTS, use GOP TC for sync
!> GOP# 2395 has no PTS, use GOP TC for sync
!> GOP# 4285 has no PTS, use GOP TC for sync
Außerdem zeigt ProjectX bei der mit ffmpeg erstellten Datei bei "Audio PTS: ... last packet" eine um 48 Millisekunden "frühere" Zeit an. ProjectX kann also die von ffmpeg erzeugten Fehler vollständig korrigieren, das eine oder andere Programm oder Gerät könnte durch diese Fehler aber kleine Problemchen bekommen.
 

abgdf

Guru
josef-wien schrieb:
josef-wien schrieb:
Wenn der Rekorder dasselbe macht, was bei der Erstellung einer DVD passiert, nämlich nach genau 1 GiB eine neue Datei zu beginnen, dann ...
... entspricht mit cat die Dateigröße der Summe der Einzeldateien. Mit ffmpeg ist die Dateigröße um mehr als 1 Prozent kleiner, das Original wird also verändert.
Das könnte z.B. daran liegen, daß der (Anfangs-)Header der zweiten Datei weggeschnitten wurde, was ja erwünscht wäre.
josef-wien schrieb:
Wenn ich mit ProjectX die Ergebnisse von cat und ffmpeg jeweils in Bild und Ton zerlege, sind diese Dateien identisch. Bei der mit cat erstellten Datei läuft ProjectX fehlerfrei durch, bei der mit ffmpeg erstellten Datei werden drei Fehler angemerkt:
Code:
!> GOP# 292 has no PTS, use GOP TC for sync
!> GOP# 2395 has no PTS, use GOP TC for sync
!> GOP# 4285 has no PTS, use GOP TC for sync
Außerdem zeigt ProjectX bei der mit ffmpeg erstellten Datei bei "Audio PTS: ... last packet" eine um 48 Millisekunden "frühere" Zeit an. ProjectX kann also die von ffmpeg erzeugten Fehler vollständig korrigieren, das eine oder andere Programm oder Gerät könnte durch diese Fehler aber kleine Problemchen bekommen.
Es kommt eben immer auf die konkreten Dateien an. Bei Deinen Dateien scheint es zu klappen. Aber ist es bei Dir auch wirklich dasselbe Dateiformat wie bei dieser Dreambox? Ich habe solche Dreambox-Dateien nicht, deswegen kann ich nur sagen, ich weiß es nicht, ob 'cat' geht, denn ich kann's hier nicht testen. Bei "ffmpeg" kann man dagegen relativ sicher sein, daß es bei den meisten Dateiformaten vernünftige Ergebnisse liefert (jedenfalls, wenn man die richtigen Optionen setzt), denn für den Zweck ist es ja geschrieben (im Gegensatz zu cat).
 

framp

Moderator
Teammitglied
Wenn die Medienteile einfache splits sind, dann setzt cat die auch wieder korrekt zusammen. Wenn man aber unterschiedliche Medien mit unterschiedlichen Medienparametern zusammensetzen will muessen natuerlich die Metadaten angepasst werden.
 

josef-wien

Ultimate Guru
Ich schreibe diesen Beitrag nicht für abgdf, dessen Glaube an die "Allmacht" von ffmpeg ich ihm lasse, sondern für Mr.Tito, um ihn von der Verwendung eines (sagen wir es vorsichtig) nicht optimal geeigneten Werkzeugs abzuhalten.

Mr.Tito schrieb:
Eine Sendung besteht i.d.R. aus mehreren Dateien, die immer ein GB groß sind.
Die Wahrscheinlichkeit, daß es sich bei exakt gleich großen Dateien um logisch voneinander unabhängige Dateien (mit eigenem header) und nicht um eine Dateitrennung per Bytes-Anzahl (ohne Berücksichtigung des Inhalts) handelt, liegt bei Null, da brauche ich gar keinen Blick in die ersten zwei Sektoren dieser Dateien zu werfen. (Die letzte Datei ist natürlich kleiner als die übrigen.)

abgdf schrieb:
Das könnte z.B. daran liegen, daß der (Anfangs-)Header der zweiten Datei weggeschnitten wurde
Ab der 2. Datei ist definitiv kein header vorhanden, die Größenreduzierung von ffmpeg hat andere Ursachen.

Das concat protocol von ffmpeg (auf das sich mein vorheriger Beitrag bezieht) ist im vorliegenden Fall nur mit Einschränkungen geeignet. So nebenbei bemerkt produziert der mit der Version 1.1 eingeführte concat demuxer von ffmpeg im vorliegenden Fall ein absolut unbrauchbares Ergebnis (die erste Datei wird am Ende mit einer Anzahl unsinniger Bytes ergänzt, und das war es).
 
OP
M

Mr.Tito

Member
So, ich möchte mich nochmal melden und meine Lösung kurz vorstellen.
Wie es aussieht, habe ich mit cat nur minimale Probleme. Das bedeutet hier, dass sich die Tonspur möglicherweise etwas verschoben hat, Das macht mir aber nichts, weil ich mit dem Medienplayer (xbmc) die Möglichkeit habe, diese schnell zurechtzurücken. Außerdem geht es mir ja nur um eine Übergangszeit, bis die alten Aufnahmen alle weggeguckt sind. Alles neue wird jetzt in einer einzigen Datei aufgenommen.
Tja und die Shell-Skripterei habe ich mir auch etwas einfacher vorgestellt und leider nicht hinbekommen. Ich bin in php zuhause und habe mir damit ein Skript zusammengebastelt, dass das cat mit den entsprechenden Parametern aufruft.

Vielen Dank an alle Helfer
 

josef-wien

Ultimate Guru
Mr.Tito schrieb:
dass sich die Tonspur möglicherweise etwas verschoben hat
Entweder ist das in den Ursprungsdateien schon so, oder es ist doch keine Dateitrennung per Bytes-Anzahl (ohne Berücksichtigung des Inhalts) und somit kein Fall für cat.
 
Oben