OSX / MacOs 批量将十六进制文件名重命名为十进制文件名

OSX / MacOs batch rename hexadecimal filenames to decimal filenames

我想将名称中带有十六进制部分的文件名重命名为十进制。例如:MOV12B.MODMOV12C.MOD等。至MOV299.modMOV300.MOD

这可以在终端中完成吗?

可以使用以下方法重命名扩展:

find . -name "*.MOD" -exec rename 's/\.MOD$/.MPG/' '{}' \;

但是如何将文件重命名为十进制?

当然,您可以使用 rename,也称为 Perl renameprename,它最简单地安装在 macOS 上 homebrew 使用:

brew install rename

那么命令就是:

rename --dry-run 's/[0-9A-F]+/hex($&)/e' *MOD

示例输出

'MOV10.MOD' would be renamed to 'MOV16.MOD'
'MOV12B.MOD' would be renamed to 'MOV299.MOD'
'MOV12C.MOD' would be renamed to 'MOV300.MOD'
'MOVBEEF.MOD' would be renamed to 'MOV48879.MOD'

如果您喜欢它的功能,请删除 --dry-run 部分并真正做到。

无论如何,我建议您在尝试此操作之前进行备份,因为如果您的电影实际命名为 "Film 23.MOD" 而不是 "MOV12B.MOD",您将得到:

'Film 23.MOD' would be renamed to '15ilm 23.MOD'

如果你想把日期也放进去,你可以这样做:

rename --dry-run 's/[0-9A-F]+/hex($&)/e; s|.MOD| 17/01/2018.MOD|' *MOD

示例输出

'MOV12A.MOD' would be renamed to 'MOV298 17/01/2018.MOD'

为什么在手册页中找不到它?嗯,里面有一行随便说你可以通过一行Perl代码来修改名字。这意味着 完整的 Perl 语言 对你可用 - 所以你可以编写几页代码来访问数据库,运行 远程机器上的东西,或者获取 URL 以重命名您的文件。

我的代码中唯一棘手的事情是 e 潜伏在最后:

s/search/replace/e

e 表示 search/replace 的后半部分实际上是 执行的 所以它不是直接的文本替换,它是一个新程序从 $& 的左侧获取搜索字符串,并可以对其进行数学运算或查找。

我已经做了一些涉及类似技术的其他答案...

here, here, .


如果你想把文件的修改时间也放到它的名字中,你需要做更多的工作。首先,stat() 更改文件名之前的文件 ;-) 请记住,您在 $_ 中收到原始文件名。然后做十六进制到十进制的事情,然后添加 mtime。请记住 Perl 使用点将字符串连接在一起。

因此,命令将如下所示:

rename --dry-run 'my $mtime=(stat($_))[9]; s/[0-9A-F]+/hex($&) . " " . $mtime/e;' *MOD

示例输出

'MOV12A.MOD' would be renamed to 'MOV298 1516229449.MOD'

如果所有的替换和评估都太多了,你总是可以做你所有的计算并将结果分配给 Perl 的 $_ 变量,通过它你接收到文件名并在其中传递所需的名称至 rename。因此,举个例子:

rename --dry-run 'my $prefix="PREFIX "; my $middle=$_; my $suffix=" SUFFIX"; $_=$prefix . $middle . $suffix;' *MOD 
'MOV12A.MOD' would be renamed to 'PREFIX MOV12A.MOD SUFFIX'

只有真正的程序员才会用十六进制名称存储他的电影 - 向你致敬!