【问题标题】:Linux use a filename to derive parameters fromLinux 使用文件名从
【发布时间】:2017-08-30 12:00:00
【问题描述】:

我正在为一个项目使用 raspbian

这是我的情况。我正在创建三个文件:

  1. wav 文件,文件名格式为 [date_and_timestamp].wav
  2. 一个 avi 文件,文件名格式为 [date_and_timestamp].avi
  3. 一个名为 marker_[date_and_timestamp] 的文件

[date_and_timestamp] 的值在所有三个文件中都是一致的。

我想要做的是查找所有以 marker_ 开头的文件,获取 [date_and_timestamp] 部分并使用它作为参数传递给ffmpeg合并这两个文件(即最终得到一个看起来像

的命令
ffmpeg -i /home/motion/[date_and_timestamp].avi -i /home/motion/[date_and_timestamp].wav /home/motion/[date_and_timestamp].mp4

鉴于sh 的强大功能,我知道会有办法,但我很难知道它是什么。

为了清楚起见,方括号在那里。它们不会出现在文件名中。

【问题讨论】:

标签: linux bash ffmpeg sh


【解决方案1】:
ls -l marker_* | awk -F[ '{ system("ffmpeg -i /home/motion/["$2".avi -i /home/motion/["$2".wav /home/motion/["$2".mp4") }'

这将列出所有以marker_开头的文件并将其传递给awk,提取date_and_timestamp(由[分隔的$2),然后使用它将日期传递给awk系统函数并形成要执行的命令。在构建要与系统函数一起使用的命令时,请特别注意引号。

【讨论】:

  • Don¨t parse ls -- 它没有做任何有用的事情,shell 已经扩展了通配符。 printf "%s\n" marker_* 将是一种更健壮和正确的方式来驱动管道,但仍然不能正确处理包含换行符的文件名。
【解决方案2】:

您似乎正在寻找类似的东西。

for marker in marker_*; do
    ffmpeg -i "${marker#marker_}.avi" -i "${marker#marker_}.wav" "${marker#marker_}.mp4"
done

在正确的目录中运行它,您不必在ffmpeg 命令中硬编码路径名。

符号${variable#prefix} 产生variable 的值,如果存在则删除prefix% 有一个类似的结构来删除后缀。

【讨论】:

  • 这是史诗。我试图用 awk -> 一个数组来做,然后迭代数组。你的方法要优雅得多。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-21
  • 2015-08-20
  • 2014-06-25
  • 1970-01-01
  • 2017-12-30
  • 2018-03-02
  • 2017-07-11
  • 2011-10-15
相关资源
最近更新 更多