使用 find [重复] 在 bash 中操作字符串(文件扩展名)

Posted

技术标签:

【中文标题】使用 find [重复] 在 bash 中操作字符串(文件扩展名)【英文标题】:Manipulating strings (file extensions) in bash using find [duplicate] 【发布时间】:2016-09-24 08:27:14 【问题描述】:

我在 bash 中处理字符串时遇到问题。我想重写扩展。

我在下载目录中有以下 2 个文件

示例 001.mkv 示例 002.mkv

使用下面的脚本,我总是返回相同的文件名,而无需将 .mkv 重写为 .mp4。

find /Downloads -name \*.mkv -execdir echo $(file=; echo $file/mkv/mp4;) \;

我知道这不是重新格式化文件所需的全部内容,但此脚本是传递给 FFMPEG 的较大脚本的一部分。

这是 FFMPEG 的完整命令。

find /Downloads -name \*.mkv -execdir ffmpeg -i  -vcodec copy -acodec copy $(file=; echo $file/mkv/mp4;) \;

【问题讨论】:

我已经尝试了该帖子中的许多示例,但仍然没有运气。我已经添加了我正在使用的完整命令。 您可以尝试在 -execdir 命令之后使用 bash -c,查看我的答案以获取示例。 【参考方案1】:

你可以尝试使用 bash -c 来执行你的命令

find /Downloads -name \*.mkv -execdir bash -c 'file=; echo $file/.mkv/.mp4' \;

【讨论】:

【参考方案2】:

exec 和 execdir 通常用于实际执行命令,而不是回显/打印有关找到的文件的信息 (print/printf)。

有几种方法可以做到这一点,这里有一种。

您可以先尝试使用 rename 命令,该命令可以使用正则表达式替换来重命名文件。这将需要将所有文件重命名为位于同一文件夹 /Downloads 中:(语法可能非常取决于发行版附带的重命名实现)

ls *.mkv
a.mkv  b.mkv
rename .mkv .mp4 *.mkv
ls *.mp4
a.mp4
b.mp4

假设 mkv 文件也存在于 /Downloads 的子目录中:

find . -type f -name "*.mkv"
./sundir/d.mkv
./sundir/c.mkv
./a.mkv
./b.mkv
find -type f -name "*.mkv" -exec rename .mkv .mp4  \;
find . -type f -name "*.mp4"
./sundir/c.mp4
./sundir/d.mp4
./b.mp4
./a.mp4

【讨论】:

以上是关于使用 find [重复] 在 bash 中操作字符串(文件扩展名)的主要内容,如果未能解决你的问题,请参考以下文章

Bash字符串爆炸[重复]

在linux bash中替换字符串[重复]

使用 bash 获取部分字符串 [重复]

在bash字符串中写入特殊字符[重复]

如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]

在字符后获取字符串[重复]