将 2 个具有不同扩展名的相似文件重命名为第一个文件,但保留扩展名

将 2 个具有不同扩展名的相似文件重命名为第一个文件,但保留扩展名

我在同一目录中有多组 .m4v 和 .srt 文件,但名称仅匹配前 3 个字符。如何重命名 .srt 文件以匹配相应的 .m4v 文件(当然同时保留 .srt 扩展名)?

在此输入图像描述

答案1

.m4v给定shell 变量中的一个名称,通过修剪第一个空格并添加文件名后缀即可获得name相应文件的名称。.srt$name.srt

这是用 完成的${name%% *}.srt。这会删除最长的后缀字符串匹配*$name然后添加.srt到该结果的末尾。

文件的新名称.srt$name,但.m4v文件名后缀更改为.srt.

这是用 完成的${name%.m4v}.srt。这会删除匹配.m4v的(最短)后缀字符串$name ,然后添加.srt到该结果的末尾。

以下是一个循环,它使用上面的两个参数替换来重命名给定当前目录中找到的文件.srt列表的每个文件。.mv4该循环还可以让您知道是否存在.m4v没有相应.srt文件的文件,或者该文件的新名称是否.srt已存在。

for name in *.m4v; do
    if [ ! -e "${name%% *}.srt" ]; then
        printf 'Can not find .srt file for "%s"\n' "$name"
        continue
    elif [ -e "${name%.m4v}.srt" ]; then
        printf '.srt file for "%s" already exists\n' "$name"
        continue
    fi >&2

    mv -- "${name%% *}.srt" "${name%.m4v}.srt"
done

答案2

zsh

for f (???.srt) () {
  (( $# == 1 )) && mv -- $f $1:r.srt
} $f[1,3]?*.m4v(NY2)

只要有一个这样的 m4v 文件,就会重命名该???.srt文件,并复制具有相同 3 个字符前缀的文件r的 oot 名称。m4v

相关内容