OSX / MacO批处理将十六进制文件名重命名为十进制文件名

时间:2018-01-17 11:28:31

标签: bash macos file-rename

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

这可以在终端完成吗?

可以使用以下命令重命名扩展名:

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

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

1 个答案:

答案 0 :(得分:2)

当然,您可以使用rename(也称为Perl renameprename来执行此操作,该brew install rename 最简单地安装在带有自制的macOS上,使用:

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'

示例输出

e

为什么你不能在手册页中找到它?好吧,那里有一条线,随便说你可以传递一行Perl代码来修改名称。这意味着整个Perl语言可供您使用 - 因此您可以编写几页代码来访问数据库,在远程计算机上运行某些内容,或者获取URL以重命名您的文件。

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

e

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

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

hereherehere

如果您想将文件的修改时间也放在其名称中,您还需要做更多的工作。首先,在更改名称之前$_文件;-)请记住,您在mtime中收到原始文件名。然后执行十六进制到十进制的操作,然后添加rename --dry-run 'my $mtime=(stat($_))[9]; s/[0-9A-F]+/hex($&) . " " . $mtime/e;' *MOD 。记住Perl使用一个点来连接字符串。

所以,命令看起来像这样:

'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' 。所以,举个例子:

usort($sales, function($a, $b) {
    return $b['price'] <=> $a['price'];
});

只有真正的程序员才能用十六进制名称存储他的电影 - 给你的荣誉!