Dak*_*ari 4 unix find string-manipulation file-extension
鉴于需要从位于子目录中的视频文件中提取音频的情况,如何正确命名生成的文件?
以下单行工作,但保留旧的文件扩展名。
find -name "*.mp4" -exec ffmpeg -i {} -vn -acodec copy {}.aac -hide_banner \;
Run Code Online (Sandbox Code Playgroud)
当前结果:
foobar.mp4 --> foobar.mp4.aac
Run Code Online (Sandbox Code Playgroud)
期望的结果:
foobar.mp4 --> foobar.aac
Run Code Online (Sandbox Code Playgroud)
find本身没有任何机制可以让您从替换{}. 甚至{}.aac可能不支持添加后缀(如您所做的 : )。POSIX 说:
仅包含两个字符“{}”的实用程序名称或参数应替换为当前路径名。如果实用程序名称或参数字符串包含两个字符“{}”,而不仅仅是两个字符“{}”,则find 是替换这两个字符还是不更改地使用字符串由实现定义。
foo{}bar尽管有许多实现,但还是可以工作,但请注意。要做更多的事情,您肯定需要一个可以操作字符串的工具;通常是一个外壳。在你的情况下:
find . -name "*.mp4" -exec sh -c 'ffmpeg -i "$1" -vn -acodec copy "${1%.*}.aac" -hide_banner' sh {} \;
Run Code Online (Sandbox Code Playgroud)
这里${1%.*}负责获取没有扩展名的路径名。
你可能会取代ffmpeg -i "$1"与ffmpeg -i "{}"里面的命令字符串传递给sh。不要这样做。我的另一个答案解释了为什么后者是错误的(以及为什么find . -name …比 更好find -name …)。
| 归档时间: |
|
| 查看次数: |
1138 次 |
| 最近记录: |