Du beschreibst damit drei additive Anforderungen, die sich nicht gegenseitig aufheben sollen, korrekt?
1. Ordner auf neue Dateien überwachen und verarbeiten
2. "kann ich diese Befehlszeile für jede Datei in einem Ordner und dessen Unterordner ausführen lassen"
3. "Wie kann ich nur wenn die Konvertierung die ganze Datei konvertieren konnte das Original löschen lassen?"
Vorbereitungen/ Beispiele zu 1.:
sudo apt-get install inotify-tools
inotifywait -mr /home
inotifywait -mr --excludei mtab /etc
Könnte am Ende etwa so aussehen (ORDNER einsetzen):
| cd ORDNER
while true; do
for datei in */*.ts; do
if nice -n 14 ffmpeg -i "$datei" -map 0:0 -map 0:1 -c:v libx264 -vf scale=-1:720 -r 25 -c:a:0 copy -sn out-file.mkv; then
echo rm "$datei"
fi
done
sleep 10m
done
|
Annahme: Es existiert nur max. ein Unterordner und es geht nur um .ts-Dateien. Zunächst wird der Löschbefehl nur ausgegeben. Soll er tatsächlich ausgeführt werden, das echo vor rm entfernen. Das wird nun alle 10 min erneut überprüft, wenn du das als Script in den Autostart legen würdest. Dann braucht es also also nicht mal inotify, es sei denn, es soll instantan erfolgen und die Schleife nicht dauernd aufgerufen werden.
Das geht auch nur, weil wir die ts-Datei gleich danach löschen. Und wenn eine mit Fehler auftritt, wird es an ihr alle 10 min wieder versucht. Beide Probleme (das eine hier nur fiktiv) kann man mit inotify eindämmen, indem nur neue Dateien geprüft werden (ab dem Zeitpunkt, wo der Server mit dem Script läuft).
Mit inotify:
Da müsste man dann erst einmal einen Durchlauf mit den alten Dateien machen, ggf. einmalig:
| cd ORDNER
for datei in */*.ts; do
if nice -n 14 ffmpeg -i "$datei" -map 0:0 -map 0:1 -c:v libx264 -vf scale=-1:720 -r 25 -c:a:0 copy -sn out-file.mkv; then
echo rm "$datei"
fi
done
|
Danach inotify auf die Lauer schicken (das fertige Beispiel in der man ist sehr gut!):
| cd ORDNER
while inotifywait -r -e modify .; do
for datei in */*.ts; do
if nice -n 14 ffmpeg -i "$datei" -map 0:0 -map 0:1 -c:v libx264 -vf scale=-1:720 -r 25 -c:a:0 copy -sn out-file.mkv; then
echo rm "$datei"
fi
done
done
|
Beide Varianten sind noch ungetestet - nur als Anregungen zu verstehen. Dafür aber immerhin mehr oder minder fertig ausgearbeitete.
Jetzt könnte man in dem letzten Codeblock noch versuchen, die ineffiziente Suche nach */*.ts rauszuwerfen, indem man dessen --format %f Option nutzt. Aber das mit inotify haut sowieso noch nicht hin, beim Ordner findet es gerade meine Testdatei nicht und es würde ja auch unendlich weiterlaufen und ohne -m bei der ersten Datei beenden, müsste also in die Endlosschleife mit rein.
Aber man kann ja, wie gesagt, drauf verzichten. Ich schick's nun nur erst mal ab und später sehen wir hier alle weiter. Meine ersten Beispiele für inotifywait funktionierten jedenfalls immer, falls man da was draus machen wöllte. Ich schau mir auch mal kurz inotifywatch an, auch interessant, für Statistiken der Zugriffe.
Grüße, Benno