【问题标题】:How to run multiple commands on file pairs using a shell script?如何使用 shell 脚本在文件对上运行多个命令?
【发布时间】:2017-09-16 18:19:06
【问题描述】:

我查看了 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)
}

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

【问题讨论】:

    标签: linux bash macos shell ffmpeg


    【解决方案1】:

    当您使用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“前缀”会调用什么。)

    【讨论】:

    • 非常感谢@Scheff!您提供的脚本开箱即用,并在此过程中教会了我一些有关 shell 脚本的知识!
    • 我确实必须在命令中的 -i 之后删除“$FILE_FIXED”,除此之外一切都很顺利。
    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多