Существует обновленное объяснение . Заявленные преимущества включают:
Для тех, кто уже знаком с systemd, это означает более стандартизированный и последовательный способ выполнения таких действий, как запуск, остановка и отключение служб, установка переменных среды для приложений, а также просмотр и управление журналами для определенных служб.
Лично я не был знаком с тем, как раньше управлялись все части сеанса Gnome, но я знаком с systemd, так что это облегчит понимание моего рабочего стола и управление им.
Кажется, вы делаете это очень окольным путем, используя слишком много совпадений с регулярными выражениями.
А что насчет этого?
#!/bin/bash
shopt -s nullglob
for video in *.mkv *.webm *.mp4; do
name=${video%.*}
set -- "$name".*.vtt
if [ -e "$1" ]; then
lang=${1#$name.}
lang=${lang%.vtt}
mkvmerge -o "subs$name.mkv" "$video" --language "0:$lang" "$1"
fi
done
Это предполагает, что вы хотите использовать первый файл .vtt
, найденный для данного $name
(, если существует несколько файлов .vtt
, например. для многих языков ).
Цикл перебирает все имена, соответствующие любому из трех шаблонов *.mkv
, *.webm
и *.mp4
.Таким образом, вам не нужно проверять свою переменную цикла на соответствие этим суффиксам, чтобы выяснить, соответствует ли она какому-либо из них.
Учитывая имя файла в $video
, часть имени затем извлекается путем простого удаления суффикса имени файла, каким бы он ни был. Это дает нам $name
.
С помощью set
мы сопоставляем шаблон "$name".*.vtt
. Если этот шаблон соответствует хотя бы одному имени файла, то это имя файла будет в $1
, и мы извлечем из него языковую часть (бит, который соответствует *
в шаблоне ), удалив $name.
из спереди, а затем .vtt
с конца совпадающего имени файла.
Затем мы вызываем mkvmerge
с необходимой информацией. Мы не вызываем mkvmerge
, если не было .vtt
файла (, который, по-видимому, делает ваш код ).
Также обратите внимание, что если есть несколько файлов с одинаковым именем перед суффиксом имени файла, например. thing.mp4
и thing.mkv
, то они приведут к идентичным mkvmerge
командам с тем же -o
именем(substhing.mkv
).
Вы можете обойти это, перебирая файлы .vtt
и затем выбирая наиболее интересующий вас формат видеофайла, соответствующий имени файла .vtt
.
Тем не менее, вам ни в коем случае не нужно использовать регулярные выражения для чего-либо из этого.
Ниже приведен вариант, который рассматривает все .vtt
файлы для данного имени:
#!/bin/bash
shopt -s nullglob
for video in *.mkv *.webm *.mp4; do
name=${video%.*}
sub_opts=()
for sub in "$name".*.vtt; do
lang=${sub#$name.}
lang=${lang%.vtt}
sub_opts+=( --language "0:$lang" "$sub" )
done
if [ "${#sub_opts[@]}" -gt 0 ]; then
mkvmerge -o "subs$name.mkv" "$video" "${sub_opts[@]}"
fi
done