bashスクリプトの入力ファイルと出力ファイルの名前を同じにするにはどうすればよいですか?

bashスクリプトの入力ファイルと出力ファイルの名前を同じにするにはどうすればよいですか?

「2020-02-24-16-13.h264」のように日付名を付けたファイルで作業しています。 MP4Boxがbashスクリプトでこれらのすべてのファイルを処理しようとしていますが、出力ファイルの名前を正しく指定する方法がわかりません。

デフォルトでは、スクリプトは自動的に.h264ファイルの名前を取得し、同じ名前の.mp4として出力したいと思います。

この操作を手動で実行するために使用するコマンドは次のとおりです。

MP4Box -add /mnt/usb/Convert/2020-02-24-16-13.h264 /mnt/usb/Converted/2020-02-24-16-13.mp4

私の場合、ffmpeg回避策に切り替えることはできません。

これが簡単なコマンド調整だったらよかったのに、どんな意見でも送って頂ければとても感謝します!

ベストアンサー1

このような。

for f in /mnt/usb/Convert/2020-02-24-16-13.h264; do
   echo MP4Box -add "$f" "${f%.*}.mp4"
done

出力

MP4Box -add /mnt/usb/Convert/2020-02-24-16-13.h264 /mnt/usb/Convert/2020-02-24-16-13.mp4

次に終わるファイルが多い場合*.h264

for f in /mnt/usb/Convert/*.h264; do
   echo MP4Box -add "$f" "${f%.*}.mp4"
done

これを内部で使用する場合/mnt/usb/Convert

for f in *.h264; do
  echo MP4Box -add "$f" "${f%.*}.mp4"
done

変換されたファイルをOPの元の質問だったConvertedディレクトリに出力します(この点に気付かず申し訳ありません)。

for f in /mnt/usb/Convert/2020-02-24-16-13.h264; do
  n=${f/Convert/Converted}
  echo MP4Box -add "$f" "${n%.*}.mp4"
done

出力。

MP4Box -add /mnt/usb/Convert/2020-02-24-16-13.h264 /mnt/usb/Converted/2020-02-24-16-13.mp4

すべてのファイルをバッチ処理します。

for f in /mnt/usb/Convert/*.h264; do
  n=${f/Convert/Converted}
  echo MP4Box -add "$f" "${n%.*}.mp4"
done

${string/search/replace}bash PE関連の代替

for f in /mnt/usb/Convert/*.h264; do
  n=${f##*Convert}
  m=${f%Convert*}
  echo MP4Box -add "$f" "${m}Converted${n%.*}.mp4";
done

上記(最後の例)はbash構文に限定されず、すべてのPOSIX互換シェルで動作します。

  • echo出力が満足な場合は削除してください。

  • パラメータ拡張ビューPAGER='less +/^[[:space:]]*parameter\ expansion' man bash

おすすめ記事