如何使用shell脚本在文件对上运行多个命令?

时间:2017-04-20 08:22:19

标签: linux bash macos shell ffmpeg

我在其他几个人中看过this postthis post。他们提供了一些关于如何开始的信息,不幸的是我的用例稍微复杂一些。

我有一对运行ffmpeg命令的视频文件。我运行的命令将元数据从原始文件传输到转换后的文件,如下所示:

christian$ ffmpeg -i file_1.mov -i file_1.mp4 -map 1 -map_metadata 0 -c copy file_1_fixed.mp4

This post解释了命令的作用,如果需要解释的话。基本上,用例是原始文件和转换后的文件都具有相同的名称,但扩展名不同。我将如何编写一个shell脚本,在目录中找到所有这些对,并为每对编写并运行上面指定的命令?

我假设,从逻辑的角度来看,我需要循环遍历所有对,获取文件名,进行某种字符串操作(如果甚至可以使用shell脚本),编写命令并运行它

您可以向我指出的任何资源都将深表感谢。只是为了澄清一些伪代码:

for (file in directory) {
  string name = file.getname
  string command = "ffmpeg -i " + name + ".mov -i " + name + ".mp4 -map 1 
  -map_metadata 0 -c copy " + name + "_fixed.mp4"
  run(command)
}

希望这是有道理的,如果我要澄清更多,请告诉我。谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

当您使用bash标记此问题时,我会将此草图发送给bash脚本。这应该是一般的,但您可以根据实际需要进行调整:

#!/usr/bin/bash
# for debugging remove the hash from next line:
#set -x
# loop over all .mov files
for FILE in *.mov; do
  FILE_MP4="${FILE/.mov/.mp4}"
  FILE_FIXED="${FILE/.mov/_fixed.mp4}"
  ffmpeg -i "$FILE" -i "$FILE_MP4" -map 1 -map_metadata 0 -c copy "$FILE_FIXED"
done

注释/提示:

  1. for FILE in *.mov遍历所有扩展名为.mov但没有其他文件的文件。这很好,因为如果在同一目录中多次调用它甚至可以工作。

  2. for循环将在当前目录中搜索。您可以使用cd更改为特定目录。 (也可以处理绝对或相对文件路径而不是名称......)

  3. 小心选择报价。引用bash非常强大,但绝对不容易。

  4. 要检查此脚本,可以在ffmpeg命令前加上命令echo。这就像一场枯竭。 (如果没有echo“前缀”,你会看到会被调用的内容。)