Ось повну відповідь, яку я зробив відповідно до своїх потреб.
Код
#!/bin/zsh
mkv_sub_getshort() {
sub=$1
sub="${sub%.${sub:e}}"
sub="$(sed 's/^.*[[:punct:]]//g' <<< "$sub")"
echo $sub
}
mkv_maker() {
local c=0
for i in *srt; do
LOCAL_SUB[((++c))]="$i"
LOCAL_SUB_SHORT[$c]="$(mkv_sub_getshort "$i")"
done
local W=" "
printf "ffmpeg -i *mp4"
printf "$(for i in ${LOCAL_SUB[*]}; do printf "${W}-i \"$i\""; done)"
printf "$(for i in $(seq $((${#LOCAL_SUB} + 1))); do printf "${W}-map $((i - 1))"; done)"
printf "${W}-c copy"
printf "$(for i in $(seq ${#LOCAL_SUB}); do ((--i)); printf "${W}-metadata:s:s:$i language=${LOCAL_SUB_SHORT[$((i + 1))]%.srt}"; done)"
printf "${W}output.mkv"
unset LOCAL_SUB LOCAL_SUB_SHORT
}
mkv_maker
Це створює команду для кількості треків субтитрів у папці.
Вибірка зразка
$ ls -a
. .. mkvmaker vid.mp4 vid_eng.srt vid_fr.srt vid_rus.srt vid_swe.srt
$ ./mkvmaker
ffmpeg -i *mp4 -i "vid_eng.srt" -i "vid_fr.srt" -i "vid_rus.srt" -i "vid_swe.srt" -map 0 -map 1 -map 2 -map 3 -map 4 -c copy -metadata:s:s:0 language=eng -metadata:s:s:1 language=fr -metadata:s:s:2 language=rus -metadata:s:s:3 language=swe output.mkv
Кредити
Кредит належить LordNeckbeard за попередню відповідь, яка допомогла мені зрозуміти, як зробити так, щоб це працювало.