Unix系统批量重命名日期时间文件 插入-和_字符规范文件名
UNIX下批量按日期规则重命名观测文件
现有一批前缀为SURFACE_OBS:的文件,冒号后为连续的YYYYMMDDHH格式时间串,需要插入分隔符改为YYYY-MM-DD_HH的易读格式,可按以下方案操作:
方案1:使用Perl版rename(最简便,适用于Debian/Ubuntu等系统)
Perl版本的rename(也叫prename)是Debian、Ubuntu等发行版默认预装的重命名工具,支持正则表达式匹配替换,批量处理效率高。
- 先执行干运行预览改动(不会实际修改文件),核对重命名规则是否符合预期:
执行后会逐行输出rename -n 's/(\d{4})(\d{2})(\d{2})(\d{2})$/$1-$2-$3_$4/' SURFACE_OBS:*原文件名 -> 新文件名的对应关系,确认所有输出和目标格式完全一致再进行下一步。 - 确认预览结果无误后,去掉
-n参数执行实际重命名:rename 's/(\d{4})(\d{2})(\d{2})(\d{2})$/$1-$2-$3_$4/' SURFACE_OBS:*
方案2:Shell循环+sed(通用方案,兼容所有UNIX/Linux发行版)
如果系统没有预装Perl版rename(比如RHEL/CentOS/Fedora默认搭载的util-linux版rename不支持正则替换),可以用原生shell命令组合实现,兼容性覆盖所有UNIX类系统。
- 先新建预览脚本执行,仅打印重命名计划不修改文件:
for f in SURFACE_OBS:*; do newname=$(echo "$f" | sed -E 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})$/\1-\2-\3_\4/') echo "Will rename: $f -> $newname" # 首次执行时保留mv行的注释,不要放开 # mv -- "$f" "$newname" done - 逐行核对输出的新旧文件名对应关系,确认完全符合要求后,删除
mv行开头的#注释符,再次执行脚本即可完成批量重命名。
注意事项
- 所有重命名操作前必须先做预览核对,避免误操作导致文件名混乱
- 命令中正则通过
$锚定了文件名末尾的10位时间串,只会匹配符合SURFACE_OBS:YYYYMMDDHH规则的文件,不会误改目录下其他无关文件 mv后的--参数用于兼容特殊文件名,避免文件名被误识别为命令参数
内容的提问来源于stack exchange,提问作者blackie
相关产品推荐
相关产品推荐

