我想将名称中十六进制部分的文件名重命名为十进制。例如:MOV12B.MOD
,MOV12C.MOD
等。MOV299.mod
,MOV300.MOD
。
这可以在终端完成吗?
可以使用以下命令重命名扩展名:
find . -name "*.MOD" -exec rename 's/\.MOD$/.MPG/' '{}' \;
但是如何将文件重命名为十进制?
答案 0 :(得分:2)
当然,您可以使用rename
(也称为Perl rename
和prename
来执行此操作,该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()
中的左侧可以对其进行数学运算或查找。
我做了一些涉及类似技术的其他答案......
如果您想将文件的修改时间也放在其名称中,您还需要做更多的工作。首先,在更改名称之前$_
文件;-)请记住,您在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'];
});
只有真正的程序员才能用十六进制名称存储他的电影 - 给你的荣誉!