Windows バッチ スクリプトからシェル スクリプトへ

Windows バッチ スクリプトからシェル スクリプトへ

Linux で実行したい Windows バッチ スクリプトがあるのですが、それをシェル スクリプトに変換するのに問題があります。

誰か助けてくれる人はいるだろうか。

:start
for /r %%F in (*.mkv) do (
C:\Python27\Scripts\ffmpeg\bin\ffmpeg.exe  -y -i "%%F" -c:v libx264 -preset ultrafast -minrate 4.5M -maxrate 4.5M -bufsize 9M -c:a ac3 "%%~dpnF.mp4"
if not errorlevel 1 if exist "%%~dpnF.mp4" del /q "%%F"
)
TIMEOUT /T 60
goto start

シェル スクリプトに変換しようとしていますが、うまくいきません。私にはこれがあまり得意ではありません。

for f in {*.mkv,*/*.mkv,*/*/*.mkv,*/*/*/*.mkv}; do 
ffmpeg -i "$f" -c:v libx264 -preset ultrafast -minrate 4.5M -maxrate 4.5M -bufsize 9M -c:a ac3 "${f%mkv}mp4";
rm "$f";

ループの仕方が分からないので、常にチェックしています。

答え1

次のようになります (bash を想定):

shopt -s globstar
for f in **/*.mkv
do 
    ffmpeg -i "$f" -c:v libx264 -preset ultrafast -minrate 4.5M -maxrate 4.5M -bufsize 9M -c:a ac3 "${f%mkv}mp4";
    [[ $? -eq 0 ]] && rm "$f";
done

実際には:

  • doneループを示す文が抜けていました
  • パターン{*.mkv,*/*.mkv,*/*/*.mkv,*/*/*/*.mkv}は間違っていないものの、ffmpeg は一致しないパターンごとにエラー メッセージを発行します。globstarとの組み合わせにより、**単一のパターンがディレクトリ レベル全体で機能します。
  • 最後に、mp4 へのトランスコード時にエラーが発生しなかった場合にのみ .mkv を消去するテストを追加しました。

関連情報