我在 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};) ;
exec 和 execdir 通常旨在实际执行命令,而不是回显/打印有关找到的文件的信息(print/printf)。
有几种方法可以做到这一点,这里有一种。
您可以首先尝试使用可以使用正则表达式替换来重命名文件的重命名命令。这将要求重命名所有文件以位于同一文件夹中/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
您可以尝试使用 bash -c 来执行您的命令
find /Downloads -name *.mkv -execdir bash -c 'file={}; echo ${file/.mkv/.mp4}' ;