それぞれ次のコンテンツを含む複数のフォルダがあります。
- ビデオファイル
xFilename.mp4
Subs
多くのsrtファイルを含むフォルダですxFilename.srt
。
各フォルダに対してコマンドをbash
実行して、mkvmerge
各mp4ファイルをそのフォルダ内のすべてのsrtファイルとマージSubs
し、mp4ファイルと同じ名前のmkvファイルを出力するにはどうすればよいですか?
それはまるで
for dir in ./* :
if (there is an mp4 file) :
name = "mp4 file name without the extension, dunno how to do that"
mkvmerge -o ./"$dir"/"$name".mkv ./"$dir"/"$name".mp4 "$dir"/Subs/*.srt
端末にどのように書きますか?
答え1
疑似コードを編集してください。
for mp4file in */*.mp4; do
[ ! -f "$mp4file" ] && continue
mkvmerge -o "${mp4file%.mp4}.mkv" "$mp4file" "${mp4file%/*}/Subs"/*.srt
done
ここで起こるのは、現在のディレクトリのサブディレクトリにあるすべてのMP4ファイルを繰り返し、見つかったmkvmerge
各ファイルに対してコマンドを実行することです。
テストは、[ ! -f "$mp4file" ]
指定されたパターンに一致するファイルがない場合をキャプチャすることです。条件がtrue(変数に既存の一般ファイルまたは一般ファイルへのシンボリックリンクを参照しない名前が含まれている場合)の場合、この反復はスキップされますcontinue
。
拡張すると、${variable%pattern}
変数値の末尾から最も短い一致部分文字列が削除されます。これは、特定のMP4ファイルを含むパス名が与えられた場合pattern
variable
mp4file
${mp4file%.mp4}.mkv
.mp4
パス名の末尾の.を削除しmp4file
ます.mkv
。${mp4file%/*}/Subs
パス名のファイル名部分と最後の部分を削除し、最後に/
追加mp4file
します。/Subs