本文目录导读:

#!/bin/bash
#批量删除文件名前的数字编号(如:01_、123- 等)
#功能:移除文件名开头的数字(及紧随其后的分隔符),保留其余部分
#用法:在包含待处理文件的目录中运行此脚本
set -euo pipefail
# 启用 extglob 以便使用更强大的模式匹配
shopt -s extglob
echo "将要处理当前目录下的文件..."
echo "操作:移除文件名开头的数字(及可选的分隔符如 _ - . 空格)"
echo "----------------------------------------"
count=0
# 遍历当前目录下的所有文件(不包含目录)
for file in *; do
# 跳过目录
[ -f "$file" ] || continue
# 使用正则匹配:以数字开头,后面跟 0或多个分隔符,然后其他内容
# 分隔符可以配置:_ - . 空格等
if [[ "$file" =~ ^[0-9]+[_-.[:space:]]*(.*) ]]; then
# 提取捕获组中的剩余文件名部分
new_name="${BASH_REMATCH[1]}"
# 如果新文件名为空(例如文件名为 "123_"),则保留原文件名并提示
if [[ -z "$new_name" ]]; then
echo "⚠ 跳过 '$file'(编号后无内容)"
continue
fi
# 检查目标文件是否已存在
if [[ -e "$new_name" ]]; then
echo "⚠ 跳过 '$file' -> '$new_name'(目标已存在)"
continue
fi
# 执行重命名
if mv -n "$file" "$new_name"; then
echo "✅ 重命名: '$file' -> '$new_name'"
((count++))
else
echo "❌ 重命名失败: '$file'"
fi
fi
done
echo "----------------------------------------"
echo "处理完成,共重命名 $count 个文件。"
使用方法
- 保存脚本:将上面的代码保存为
remove_number_prefix.sh - 赋予执行权限:
chmod +x remove_number_prefix.sh - 运行脚本:在包含待处理文件的目录中执行
./remove_number_prefix.sh
脚本功能详解
- 适用范围:移除文件名开头的数字及紧随其后的常见分隔符(、、、空格等)。
- 安全机制:
- 跳过目录,只处理文件。
- 如果重命名后的文件已存在,则跳过,避免覆盖。
- 如果文件名只有数字和分隔符(如
123_),则跳过并提示。
- 预览模式:如需先查看效果而不真正执行,可以将
mv -n替换为echo "[DRY RUN] mv '$file' '$new_name'"。
处理示例
| 原始文件名 | 重命名后 |
|---|---|
01_报告.doc |
报告.doc |
2024-08-20_照片.jpg |
照片.jpg |
备份.tar |
备份.tar |
001 数据.csv |
数据.csv |
42_README.md |
README.md |
abc.txt |
abc.txt(无变化) |
自定义分隔符
如需调整支持的分隔符,修改脚本中的正则表达式 ^[0-9]+[_-.[:space:]]*(.*) 中的 [_-.[:space:]]* 部分。
- 只移除数字和下划线:
^[0-9]+_(.*) - 移除数字和连字符或点:
^[0-9]+[-.](.*)
提示:建议先在测试目录中运行,确认效果后再用于重要文件。