如何从`find -exec`中以{}传递的路径名中删除扩展名?

医生

考虑到需要从驻留在子目录中的视频文件中提取音频的情况,如何正确命名结果文件?

以下单行代码有效,但保留了旧的文件扩展名。

find -name "*.mp4" -exec ffmpeg -i {} -vn -acodec copy {}.aac -hide_banner \;

当前结果:

foobar.mp4 --> foobar.mp4.aac

期望的结果:

foobar.mp4 --> foobar.aac
卡米尔·马乔洛夫斯基(Kamil Maciorowski)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从 df 列表中正确循环所有 csv 并将其呈现在全局环境中,而没有完整的路径名或扩展名结尾为 df?

如何从文件路径中获取扩展名?

如何获取路径中包含数据的文件扩展名?

如何从完整文件路径中删除除文件名(无扩展名)以外的所有文件?

路径名中的文件名,不包括(未知)扩展名

如何从Visual Studio 2012中永久删除扩展名?

如何在Python中通过扩展名删除文件?

如何从VS Code中删除有问题的扩展名?

如何在FreeMarker模板中删除文件扩展名

如何从R中的basename结尾删除文件扩展名?

如何从全局环境中删除文件扩展名

如何从URL中删除html和php扩展名

如何从我的PHP页面中删除.php扩展名?

如何使用别名从 url 中删除文件扩展名

如何从 url 中删除 .php 扩展名

如何在UWP中的新SQLiteConnection中传递数据库路径名?

使用find -exec删除文件扩展名

如何从GitHub存储库中删除错误的路径名?

如何从Ruby中的文件路径获取不带扩展名的文件名

如何从Python路径中获取不带扩展名的文件名?

如何从 Python 中的路径获取不带扩展名的文件名?

如何从没有扩展名的路径中获取特定文件名python

在`find`输出结果中引用路径名

如何从参数中的文件名中删除.bat扩展名?

如何从Python中文件名列表中的文件名中删除扩展名?

如何在Shell脚本中删除文件名的扩展名?

文件名中的字符串-如何删除扩展名?

从路径中删除最后一个扩展名

如何在Java中更改文件的路径名?