Linux使用文件名从中派生参数

时间:2017-04-05 04:01:18

标签: linux bash ffmpeg sh

我正在为项目使用 raspbian

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

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

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

    我想要做的是查找以 marker _ 开头的所有文件,获取 [date_and_timestamp] 部分并使用它作为参数传递给{{1}组合这两个文件(即以一个看似

    的命令结束)
    ffmpeg

    鉴于ffmpeg -i /home/motion/[date_and_timestamp].avi -i /home/motion/[date_and_timestamp].wav /home/motion/[date_and_timestamp].mp4 有多强大,我知道会有办法,但我很难知道它是什么。

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

2 个答案:

答案 0 :(得分:0)

你好像在寻找这样的东西。

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

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

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

答案 1 :(得分:0)

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系统函数并形成要执行的命令。在构建与系统函数一起使用的命令时,请特别注意引号。