Linux使用文件名从中派生参数
我在用拉斯比安做一个项目 这是我的情况。我正在创建三个文件:Linux使用文件名从中派生参数,linux,bash,ffmpeg,sh,Linux,Bash,Ffmpeg,Sh,我在用拉斯比安做一个项目 这是我的情况。我正在创建三个文件: 文件名格式为[日期和时间戳].wav的wav文件 文件名格式为[日期和时间戳].avi的avi文件 名称标记为u[日期和时间戳]的文件 [日期和时间戳]的值在所有三个文件中都是一致的 我要做的是查找所有以marker_开头的文件,获取[date_and_timestamp]部分,并将其作为参数传递给ffmpeg,以组合这两个文件(即,以如下所示的命令结束 ffmpeg -i /home/motion/[date_and_timesta
ffmpeg
,以组合这两个文件(即,以如下所示的命令结束
ffmpeg -i /home/motion/[date_and_timestamp].avi -i /home/motion/[date_and_timestamp].wav /home/motion/[date_and_timestamp].mp4
考虑到sh
的强大功能,我知道会有办法,但要知道它是什么,我还有很长的路要走
为了清晰起见,方括号在那里。它们不会出现在文件名中。您似乎在寻找类似的内容
for marker in marker_*; do
ffmpeg -i "${marker#marker_}.avi" -i "${marker#marker_}.wav" "${marker#marker_}.mp4"
done
在正确的目录中运行它,就不必在ffmpeg
命令中硬编码路径名
符号${variable#prefix}
产生变量的值,如果存在前缀
将被删除。有一个类似的结构,使用%
删除后缀
ls -l marker_* | awk -F[ '{ system("ffmpeg -i /home/motion/["$2".avi -i /home/motion/["$2".wav /home/motion/["$2".mp4") }'
这将列出以marker_u开头的所有文件,并将其传递给awk,提取日期和时间戳($2,由[]分隔)然后使用它将日期传递给awk系统函数,并形成一个要执行的命令。在生成与系统函数一起使用的命令时,请特别注意引号。这可能是epic的重复。我试图使用awk->数组,然后迭代数组。您的方法比e优雅。谢谢!-它没有做任何有用的事情,shell已经扩展了通配符。printf“%s\n”marker.*
将是一种更加健壮和正确的方法来驱动管道,但仍然不能正确处理包含换行符的文件名。