
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 を消去するテストを追加しました。