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

时间:2016-05-26 11:05:45

标签: string bash macos ffmpeg find

我无法在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};) \;

2 个答案:

答案 0 :(得分:0)

您可以尝试使用bash -c执行命令

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

答案 1 :(得分:0)

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

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

您可以先尝试使用可以使用正则表达式替换重命名文件的rename命令。这将要求将所有文件重命名为相同的文件夹/下载:(语法可能非常根据您的发行版附带的重命名实现)

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