如何使输出文件的名称与 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

将转换后的文件输出到 Converted 目录,这是OP的原始问题(抱歉没有注意到这一点。)

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 的 shell 中工作。

  • echo如果您对输出满意,请删除。

  • 参见参数扩展PAGER='less +/^[[:space:]]*parameter\ expansion' man bash

相关内容