概要:
私は主に MKV ライブラリを MP4 に再多重化しようとしています。ビデオ ファイルから字幕を抽出するスクリプトがあります。
特定のフォルダ内の.mkvファイルを再多重化する別のスクリプトがあります。必要なのは、スクリプトがのみ.srt ファイルがあることが検出されたフォルダーを再多重化します。
すべての .srt ファイルは ***.eng.srt で終わります。
これが私の現在の remux スクリプトです:
#!/bin/bash
IFS=$'\n'
clear
for filename in *.mkv
do
echo "$filename"
newfilename="${filename%.mkv}.mp4"
echo "${newfilename}"
ffmpeg -fix_sub_duration -i $filename -c:v copy -c:a copy -c:s mov_text $newfilename
done
ありがとうございます!どんな助けでも大歓迎です。
答え1
あなたが探しているのはこれだと思います:
#!/bin/bash
clear
for filename in *.mkv
do
## Exit if there are no srt files
[ ! -e *.srt ] && echo "No .srt files found, exiting" && exit
echo "$filename"
newfilename="${filename%.mkv}.mp4"
echo "${newfilename}"
ffmpeg -fix_sub_duration -i "$filename" -c:v copy -c:a copy -c:s mov_text "$newfilename"
done
IFS='\n'
ここでは何も役に立たないので削除しましたfor
。変数を引用符で囲む限り、名前に空白が含まれていてもループは非常に安全です。
[ -e foo ]
は、の存在をテストします。foo
逆に、[ ! -e foo ]
が存在しない場合は、 は true になりますfoo
。この場合、foo
は glob ( *.srt
) なので、一致するファイルが見つかった場合、テストは false になります。上記のスクリプトでは、 は、ファイルが見つから&&
ない場合はsrt
エラー メッセージが出力され、スクリプトが終了することを意味します。