考虑到需要从驻留在子目录中的视频文件中提取音频的情况,如何正确命名结果文件?
以下单行代码有效,但保留了旧的文件扩展名。
find -name "*.mp4" -exec ffmpeg -i {} -vn -acodec copy {}.aac -hide_banner \;
当前结果:
foobar.mp4 --> foobar.mp4.aac
期望的结果:
foobar.mp4 --> foobar.aac
find
本身没有机制允许您从替换的任何东西中获取子字符串{}
。即使添加后缀(如您所做的:)也{}.aac
可能不受支持。POSIX说:
仅包含两个字符“ {}”的Utility_name或自变量应替换为当前路径名。如果某个utility_name或参数字符串包含两个字符“ {}”,而不仅仅是两个字符“ {}”,则由find替换这两个字符还是使用该字符串而无需更改由实现定义。
foo{}bar
尽管有很多实现方式,但是确实可以奏效,但仍会受到警告。要做更多的事情,您肯定需要一个可以操作字符串的工具。通常是贝壳。在您的情况下:
find . -name "*.mp4" -exec sh -c 'ffmpeg -i "$1" -vn -acodec copy "${1%.*}.aac" -hide_banner' sh {} \;
这里${1%.*}
负责获取不带扩展名的路径名。
你可能会取代ffmpeg -i "$1"
与ffmpeg -i "{}"
里面的命令字符串传递给sh
。不要这样 我的另一个答案解释了后者为什么是错误的(以及为什么find . -name …
比更好find -name …
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句