如何使用Bash字符串格式化反转日期格式并批量重命名文件?
批量重命名PDF文件:从MM-DD-YYYY到YYYY-MM-DD
这问题我日常整理文件时经常碰到,分享几个靠谱的Bash技巧,按需选用:
方法1:用rename命令(推荐,简洁高效)
如果你的系统是Debian/Ubuntu这类发行版,默认的rename是Perl版本的,直接用正则替换就能搞定:
rename 's/(\d{2})-(\d{2})-(\d{4})\.pdf/$3-$1-$2\.pdf/' *.pdf
正则解释:
(\d{2})捕获两位数字的月份(MM)(\d{2})捕获两位数字的日期(DD)(\d{4})捕获四位数字的年份(YYYY)$3-$1-$2把捕获到的内容按「年份-月份-日期」重新排列,最后保留.pdf后缀
如果是RedHat/CentOS这类系统,默认的rename是C版本的,语法不同,更推荐安装Perl版的rename(比如sudo yum install prename),之后就能用上面的命令了。
方法2:用for循环+mv(兼容性强,无依赖)
如果你的系统没有rename命令,或者担心版本差异,用Bash循环结合mv是最稳妥的:
for file in *.pdf; do # 用正则匹配文件名是否严格符合MM-DD-YYYY.pdf格式 if [[ $file =~ ^([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf$ ]]; then # 从BASH_REMATCH数组提取捕获的组,拼接新文件名 new_name="${BASH_REMATCH[3]}-${BASH_REMATCH[1]}-${BASH_REMATCH[2]}.pdf" # 先可以把mv换成echo,测试输出是否正确,没问题再执行重命名 mv "$file" "$new_name" fi done
重要提醒
- 先测试再执行:把命令里的
mv换成echo,先打印出要执行的重命名操作,确认格式正确再换成mv。 - 防止文件覆盖:如果目标目录已经存在同名的
YYYY-MM-DD.pdf文件,mv会直接覆盖它,执行前最好先排查一下。 - 精准匹配:上面的正则只会处理严格符合
MM-DD-YYYY.pdf格式的文件,其他命名格式的文件会被忽略,不会误操作。
内容的提问来源于stack exchange,提问作者jlconlin
相关产品推荐
相关产品推荐

