如何在Bash中将DD.MM.YYYY-X格式的文件夹重命名为YYMMDDIX格式?
Bash批量重命名特定格式文件夹
针对格式为DD.MM.YYYY-X的文件夹,要批量替换为YYMMDDIX格式(YY为年份后两位,DD/MM保持原内容,I为固定标识,X为原索引),可以用以下两种方法实现:
方法一:Bash原生循环(无需额外工具)
先切换到目标目录,执行以下脚本:
for dir in [0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]-[0-9]; do if [[ $dir =~ ^([0-9]{2})\.([0-9]{2})\.([0-9]{2})([0-9]{2})-([0-9])$ ]]; then new_name="${BASH_REMATCH[3]}${BASH_REMATCH[2]}${BASH_REMATCH[1]}I${BASH_REMATCH[5]}" # 先测试替换结果,没问题再去掉echo echo mv "$dir" "$new_name" # mv "$dir" "$new_name" fi done
说明:
- 通配符
[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]-[0-9]先筛选出符合格式的文件夹,避免处理无关目录 - 正则分组捕获:
BASH_REMATCH[1]:原名称中的DDBASH_REMATCH[2]:原名称中的MMBASH_REMATCH[3]:年份的后两位(YY)BASH_REMATCH[5]:原索引X
- 先执行带
echo的测试命令,确认替换结果正确后,再注释掉echo执行真实重命名
方法二:用Perl版rename命令(更简洁)
大部分Linux发行版默认自带Perl版rename,执行以下命令:
# 先测试替换结果 rename -n 's/^(\d{2})\.(\d{2})\.(\d{2})(\d{2})-(\d)$/$3$2$1I$5/' [0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]-[0-9] # 确认无误后去掉-n执行 # rename 's/^(\d{2})\.(\d{2})\.(\d{2})(\d{2})-(\d)$/$3$2$1I$5/' [0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]-[0-9]
说明:
-n参数用于模拟替换,仅输出结果不执行重命名,适合测试- 正则替换规则:用捕获分组提取DD、MM、YY、X,按
YYMMDDIX的顺序拼接新名称
注意事项:
- 如果目标目录存在重名文件夹,重命名会失败,需提前排查处理
- 确保使用的是Perl版
rename(部分系统可能默认是util-linux版,语法不同,可通过rename --version确认)
内容的提问来源于stack exchange,提问作者Our
相关产品推荐
相关产品推荐

