MacOS/OSX终端批量将含十六进制的文件名转为十进制
在MacOS终端实现十六进制文件名转十进制重命名
当然可以搞定这个需求!我们可以利用支持Perl表达式的rename工具来实现——如果你的Mac还没装这个版本的rename,先通过Homebrew安装:
brew install rename
核心命令
直接用find结合rename就能批量处理所有目标文件:
find . -name "MOV*.MOD" -type f -exec rename 's/MOV([0-9A-Fa-f]+)\.MOD/sprintf("MOV%d.MOD", hex($1))/e' {} \;
命令详解
让我拆解一下每个部分的作用:
find . -name "MOV*.MOD" -type f:遍历当前目录及所有子目录,筛选出以MOV开头、.MOD结尾的文件(-type f避免误处理目录)。rename后的Perl替换逻辑:s/原匹配模式/替换规则/e:这里的e修饰符是关键,它告诉rename把替换部分当作Perl代码执行,而不是普通字符串。MOV([0-9A-Fa-f]+)\.MOD:正则匹配文件名,捕获MOV后面的十六进制数字(支持大小写)到变量$1。sprintf("MOV%d.MOD", hex($1)):用hex()把捕获的十六进制字符串转成十进制整数,再通过sprintf拼接成新的文件名格式。
测试建议
在实际执行重命名前,强烈建议加-n参数做测试,这样只会打印出将要执行的重命名操作,不会真正修改文件:
find . -name "MOV*.MOD" -type f -exec rename -n 's/MOV([0-9A-Fa-f]+)\.MOD/sprintf("MOV%d.MOD", hex($1))/e' {} \;
比如你提到的MOV12B.MOD会显示为MOV12B.MOD -> MOV299.MOD,MOV12C.MOD会显示为MOV12C.MOD -> MOV300.MOD,确认结果符合预期后再去掉-n执行。
注意事项
- 如果你的Mac用的是默认的BSD版本
rename(不带Perl支持),必须先安装Homebrew的rename,否则上述命令会报错。 - 要是你的文件名格式有变化(比如前缀不是MOV),只需要修改正则里的
MOV部分即可,逻辑是通用的。
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

