Linux 批量重命名媒体文件和目录,在文件名和目录名末尾的年份周围加上括号

Linux 批量重命名媒体文件和目录,在文件名和目录名末尾的年份周围加上括号

我在不同目录中有多个家庭视频文件,目录名称末尾有一个年份,表示视频拍摄的年份。它也位于该目录中文件名的末尾和扩展名之前。我想在年份周围加上括号。

一些文件和目录在文件名的其他位置也可能有年份(或看起来像年份的数字),但我只想在末尾将年份括起来。例如,以下是其中一个目录:

Videos/Xmas 2004 - Time To Go 2004

包含:

Xmas 2004 - Time To To 2004.mp4  
Xmas 2004 - Time To Go 2004.txt  
Xmas 2004 - Time To Go 2004.readme  

我想批量重命名所有媒体文件,最终得到以下命名系统:

Videos/Xmas 2004 - Time To Go (2004)

包含

Xmas 2004 - Time To To (2004).mp4  
Xmas 2004 - Time To Go (2004).txt  
Xmas 2004 - Time To Go (2004).readme

我该怎么做呢?我可以使用“find”命令来获取文件和目录:

find /home/user/Videos/ -iname "* [1-2][0-9][0-9][0-9]"    # Find directories
find /home/user/Videos/ -iname "* [1-2][0-9][0-9][0-9].*"  # Find files

我想知道如何使用“-exec {} \;”结构来使用重命名或 mv 命令(或 sed 或 awk),或者我编写一个 bash 脚本来操作文件名字符串并将其放在“-exec {} \;”中。

答案1

此脚本会将所需mv命令打印到stdout。您应该将它们保存到文件 ( sh script > file) 并检查它们。如果您发现它们可以安全执行,那么您可以运行文件 ( ) 中的命令sh file。或者您可以在脚本本身中更改print为。system

find $1 -type f > /tmp/to_rename
find $1 -type d >> /tmp/to_rename
perl -lne '
    $re = qr/([12]\d\d\d)(\.\w*)?$/;
    if (/$re/) {
        $old = $_;
        s/$re/(\1)\2/;
        print("mv \"$old\" \"$_\"");
    }
' /tmp/to_rename

相关内容