如何编写Shell脚本批量裁剪PDF文件名后16字符并替换原文件
批量裁剪PDF文件名Shell实现方案
前置注意事项
- 操作前请先备份所有PDF文件,避免误操作导致文件丢失或命名混乱
- 所有方案请先执行测试逻辑,确认新文件名符合预期后再执行实际重命名
- 重命名命令默认添加不覆盖参数,若裁剪后出现重名文件会自动跳过,执行结束后可手动处理重名场景
方案1:Bash原生实现(推荐,兼容性最强)
不需要安装任何额外工具,绝大多数Linux发行版、macOS默认的Bash环境都可直接使用。
第一步:测试验证(仅打印修改结果,不实际重命名)
for pdf_file in *.pdf; do # 过滤非普通文件,避免无PDF文件时*.pdf未展开的异常 [ -f "$pdf_file" ] || continue new_name="${pdf_file:0:-16}" echo "原文件名:$pdf_file -> 新文件名:$new_name" done
检查输出结果和预期一致后,执行下一步实际重命名。
第二步:执行重命名
for pdf_file in *.pdf; do [ -f "$pdf_file" ] || continue new_name="${pdf_file:0:-16}" # -n参数表示不覆盖已存在的同名文件,--用于兼容开头带-的文件名 mv -n -- "$pdf_file" "$new_name" done
方案2:POSIX兼容实现(适用于老旧Shell/非Bash环境)
如果你的设备Bash版本过低不支持负偏移截取,可以用该方案,兼容所有POSIX标准的Shell环境。
for pdf_file in *.pdf; do [ -f "$pdf_file" ] || continue # 计算文件名总长度 name_len=$(echo -n "$pdf_file" | wc -c) # 截取前 总长度-16 位字符作为新文件名 new_name=$(echo -n "$pdf_file" | cut -c 1-$((name_len - 16))) mv -n -- "$pdf_file" "$new_name" done
方案3:Perl版rename快速实现(适用于Debian/Ubuntu等系统)
如果你的设备安装了Perl版本的rename工具(Debian/Ubuntu默认自带,macOS可通过brew install rename安装),可以用一行命令完成操作:
rename 's/.{16}$//' *.pdf
注意:该命令不兼容util-linux版本的
rename,使用前可执行rename --version确认输出包含perl相关标识再使用。
内容的提问来源于stack exchange,提问作者KaanEm
相关产品推荐
相关产品推荐

