shell批量重命名需精准匹配文件、安全构造新名并用mv执行;先用echo预览,处理空格需引号,复杂匹配推荐find+while read;示例中加日期前缀并用[-f]防错。

Shell中用for循环批量重命名同一目录下特定文件,关键在于:精准匹配目标文件 + 安全构造新文件名 + 使用mv命令执行重命名。不建议直接通配符暴力替换,应先测试、再执行。
明确匹配条件,避免误操作
先用ls或echo确认要处理的文件范围。比如只重命名所有.log文件:
- 用
for file in *.log; do echo "$file"; done预览匹配结果 - 若文件名含空格或特殊字符,务必用双引号包裹变量:
"$file" - 如需更复杂匹配(如包含"error"且以.log结尾),可用
find配合for:for file in $(find . -maxdepth 1 -name "*error*.log"); do ...,但注意空格问题,推荐用while read替代
构造新文件名,保持逻辑清晰
重命名不是简单加前缀,而是有规则地生成新名。常见做法:
- 添加统一前缀:
newname="prefix_${file}" - 替换扩展名:
newname="${file%.log}.txt"(%从末尾删除匹配部分) - 去掉固定长度前缀:
newname="${file#2023-}"(#从开头删除最短匹配) - 用
basename和dirname分离路径与文件名,确保只改名不改路径
安全执行重命名,防止覆盖或失败
实际运行前,先打印将要执行的命令(dry-run),确认无误再执行:
- 测试阶段写成:
echo mv "$file" "$newname" - 确认输出正确后,删掉
echo再运行:mv "$file" "$newname" - 加
-i参数可交互式避免覆盖:mv -i "$file" "$newname" - 检查
mv是否成功,可用&& echo "OK: $file → $newname"追加提示
完整示例:给所有.log文件加日期前缀
假设当前目录下有app.log、sys.log,想重命名为20240520_app.log等:
date_str=$(date +%Y%m%d)
for file in *.log; do
[ -f "$file" ] || continue # 跳过无匹配时产生的字面量 *.log
newname="${date_str}_${file}"
echo "Renaming: $file → $newname"
mv "$file" "$newname"
done
注意[ -f "$file" ]判断防止通配符无匹配时出错,这是健壮脚本的必要检查。











