我在不同目录中有多个家庭视频文件,目录名称末尾有一个年份,表示视频拍摄的年份。它也位于该目录中文件名的末尾和扩展名之前。我想在年份周围加上括号。
一些文件和目录在文件名的其他位置也可能有年份(或看起来像年份的数字),但我只想在末尾将年份括起来。例如,以下是其中一个目录:
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