如何用Unix命令批量重命名并修剪指定格式的PDF文件?
批量重命名PDF文件的正确方法
需求说明
原文件名格式:xyz_00011111_03202023_en-GB.pdf
要实现的效果:
- 把前缀
xyz替换成abc - 移除文件名里的日期(
_03202023)和国家代码(_en-GB)部分 - 最终文件名:
abc_00011111
原命令的问题
你之前用的命令:
$ for f in *.pdf; do mv "$f" $(echo $f | tr 'xyz' 'abc'); done
这里的tr 'xyz' 'abc'是逐个字符替换,会把文件名里所有的x换成a、y换成b、z换成c,根本不是替换前缀字符串,而且完全没处理日期和国家代码,自然达不到预期效果。
两种可行的解决方案
方法1:用sed正则匹配替换
for f in *.pdf; do new_name=$(echo "$f" | sed -E 's/^xyz_([0-9]+)_.*\.pdf$/abc_\1/') mv "$f" "$new_name" done
- 正则说明:
^xyz_匹配开头的前缀,([0-9]+)捕获中间的编号部分,_.*\.pdf$匹配后面的日期、代码和后缀,最后替换成abc_加上捕获的编号。
方法2:用bash参数扩展(无需外部命令,更高效)
for f in xyz_*.pdf; do # 先去掉.pdf后缀 base=${f%.pdf} # 拆分出前缀后的剩余部分 rest=${base#xyz_} # 提取出第一个下划线前的编号 id=${rest%%_*} # 拼接目标文件名 new_name="abc_$id" mv "$f" "$new_name" done
- 步骤说明:通过bash自带的参数扩展逐步拆分文件名,避免调用外部工具,速度更快,也更稳定。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

