如何用Bash批量将文件名中的英文月份替换为对应数字月份
文件名批量转换(英文月份转数字月份)解决方案
需求背景
- 运行环境:MXLinux
- 待处理文件:约500个格式为
2020-August-15.pdf、2021-October-15.pdf的PDF文件 - 转换目标:统一修改为
2020-08-15.pdf、2021-10-15.pdf格式,避免手动逐个修改 - 初始偏好:希望通过管道传递
ls结果的命令组合实现,尽量不写显式for循环
最终可用方案
实测稳定可用的Bash实现如下:
declare -A months=( [January]=01 [February]=02 [March]=03 [April]=04 [May]=05\ [June]=06 [July]=07 [August]=08 [September]=09 [October]=10 [November]=11 [December]=12 ) for oldname in 202[01]-[A-za-z]*-15.pdf do IFS=-. read y m d ext <<< "${oldname}" mv "$oldname" "$y-${months[$m]}-$d.$ext" done
方案优势
- 灵活性高:不需要硬编码文件后缀,通过
read按分隔符自动拆分文件名结构,后续如果文件格式变化调整成本低 - 容错性强:for循环直接用通配符匹配目标文件,不需要解析
ls输出,不会因为文件名含空格、特殊字符出现异常 - 逻辑简单易改:月份映射用关联数组直接定义,不需要反复调用
date命令做转换,执行效率更高,也方便后续调整月份匹配规则
注:该方案虽使用了显式for循环,但相比管道解析ls的实现稳定性更好,是更适合批量文件操作的写法
内容的提问来源于stack exchange,提问作者sylph
相关产品推荐
相关产品推荐

