Variadic bashスクリプトを使用して複数のディレクトリでコマンドを実行する

Variadic bashスクリプトを使用して複数のディレクトリでコマンドを実行する

それぞれ次のコンテンツを含む複数のフォルダがあります。

  • ビデオファイル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ファイルを含むパス名が与えられた場合patternvariablemp4file

  • ${mp4file%.mp4}.mkv.mp4パス名の末尾の.を削除しmp4fileます.mkv

  • ${mp4file%/*}/Subsパス名のファイル名部分と最後の部分を削除し、最後に/追加mp4fileします。/Subs

関連情報