file_rename_sorter
文件重命名排序工具
一键脚本
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/file_rename_sorter.sh)
bash <(curl -sL ../sh/file_rename_sorter.sh)
| 模式 | 命令 | 说明 |
|---|---|---|
| 默认前缀 | ./file_rename_sorter.sh |
使用默认前缀 pc |
| 自定义前缀 | ./file_rename_sorter.sh myprefix |
使用自定义前缀 |
| 指定后缀 | ./file_rename_sorter.sh pc jpg png |
仅处理指定后缀文件 |
效果预览
补充说明
该脚本用于批量文件重命名排序,将当前目录下的文件按顺序重命名为 前缀-序号.后缀 格式,适合需要批量整理文件名的场景。
功能特点
- 支持自定义文件名前缀(默认前缀为
pc) - 按三位数字序号自动编号(001, 002, 003 ...)
- 支持全部文件匹配或指定后缀名匹配
- 完全保留原文件后缀格式,不会误改扩展名
- 自动过滤隐藏文件(以
.开头的文件) - 使用临时文件夹中转,避免重命名冲突
- 彩色输出:使用 ANSI 颜色码区分信息、成功、警告、错误等提示
- 进度显示:实时显示移动和重命名进度
输出说明
脚本输出包含以下字段:
| 字段 | 说明 |
|---|---|
| 文件名前缀 | 显示用户输入或默认的文件名前缀 |
| 匹配模式 | 显示匹配全部文件或指定后缀 |
| 待处理文件数 | 显示匹配到的文件总数 |
| 移动进度 | 显示文件移动到临时文件夹的进度 |
| 重命名进度 | 显示文件重命名的进度(原文件名 → 新文件名) |
| 处理结果 | 显示成功重命名的文件数量 |
| 状态提示 | [信息]、[成功]、[警告]、[错误] 等彩色提示信息 |
注意事项
- 脚本仅处理当前目录下的文件,不递归处理子目录
- 重命名操作不可逆,建议在操作前备份重要文件
- 自动过滤隐藏文件(以
.开头)和脚本自身文件 - 使用
mv -n避免覆盖已存在的文件 - 重命名规则为:仅修改文件名、完全保留原后缀格式
- 序号采用三位数字格式(001, 002, ...),便于排序
- 如果目录中没有匹配的文件,脚本会提示并退出
- 脚本使用 bash 编写,确保运行环境支持 bash
- 重命名操作需要对应文件的写权限
脚本源码
#!/bin/bash
set -uo pipefail
gl_hui='\033[38;5;59m'
gl_hong='\033[38;5;9m'
gl_lv='\033[38;5;10m'
gl_huang='\033[38;5;11m'
gl_lan='\033[38;5;32m'
gl_bai='\033[38;5;15m'
gl_zi='\033[38;5;13m'
gl_bufan='\033[38;5;14m'
log_info() { echo -e "${gl_lan}[信息]${gl_bai} $*"; }
log_ok() { echo -e "${gl_lv}[成功]${gl_bai} $*"; }
log_warn() { echo -e "${gl_huang}[警告]${gl_bai} $*"; }
log_error() { echo -e "${gl_hong}[错误]${gl_bai} $*" >&2; }
exit_animation() {
echo -ne "${gl_lv}即将退出 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep 0.5
echo -ne "${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep 0.6
echo ""
}
file_rename_sorter() {
local default_prefix="$1"
shift
local user_ext_list=("$@")
[[ -z "$default_prefix" ]] && default_prefix="pc"
log_info "正在使用前缀: ${gl_lv}$default_prefix${gl_bai}"
local temp_folder="temp_rename_folder_$RANDOM"
local processed_count=0
local final_count=0
local all_files=()
shopt -s nullglob nocaseglob
if [[ ${#user_ext_list[@]} -eq 0 ]]; then
log_info "匹配模式: ${gl_lv}全部文件${gl_bai}(保留原后缀)"
all_files=(*)
local script_name="${0##*/}"
all_files=("${all_files[@]/$script_name/}")
else
log_info "匹配模式: ${gl_lv}指定后缀 ${user_ext_list[*]}${gl_bai}"
for ext in "${user_ext_list[@]}"; do
all_files+=(*."$ext")
done
fi
local filter_files=()
for f in "${all_files[@]}"; do
[[ -f "$f" ]] && [[ -n "$f" ]] && [[ "$f" != .* ]] && filter_files+=("$f")
done
all_files=("${filter_files[@]}")
if [[ ${#all_files[@]} -eq 0 ]]; then
echo -e "${gl_huang}当前目录中未匹配到可处理文件${gl_bai}"
exit_animation
return 1
fi
log_info "共匹配到 ${#all_files[@]} 个待处理文件"
if ! mkdir -p "$temp_folder" 2>/dev/null; then
log_error "无法创建临时文件夹"
exit_animation
return 1
fi
echo ""
log_info "正在移动文件到临时文件夹 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
for file in "${all_files[@]}"; do
if mv -n "$file" "$temp_folder/" 2>/dev/null; then
((processed_count++))
echo -e " ${gl_huang}[$processed_count/${#all_files[@]}]${gl_bai} 已移动: ${gl_lv}$file${gl_bai}"
else
log_warn "移动失败: $file"
fi
sleep 0.01
done
local moved_files=("$temp_folder"/*)
if [[ ${#moved_files[@]} -eq 0 ]]; then
log_warn "没有文件被移动到临时文件夹"
rm -rf "$temp_folder" 2>/dev/null
exit_animation
return 1
fi
echo ""
log_info "正在批量重命名文件 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
local rename_counter=1
for old_path in "${moved_files[@]}"; do
local file="${old_path##*/}"
if [[ "$file" == *.* ]]; then
local file_ext="${file##*.}"
local new_file=$(printf "%s-%03d.%s" "$default_prefix" "$rename_counter" "$file_ext")
else
local new_file=$(printf "%s-%03d" "$default_prefix" "$rename_counter")
fi
echo -e " ${gl_huang}[$rename_counter/${#moved_files[@]}]${gl_bai} 重命名: ${gl_lv}$file${gl_bai} → ${gl_lv}$new_file${gl_bai}"
if mv -n "$old_path" "./$new_file" 2>/dev/null; then
((rename_counter++))
else
log_error "重命名失败: $file"
fi
done
rm -rf "$temp_folder" 2>/dev/null
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
final_count=$((rename_counter - 1))
if [[ $final_count -gt 0 ]]; then
log_ok "文件批量重命名完成!共处理 ${gl_lv}$final_count${gl_bai} 个文件"
log_info "规则: 仅修改文件名、完全保留原后缀格式、序号三位补零"
else
log_warn "没有文件被重命名"
fi
return 0
}
show_help() {
echo -e "${gl_zi}批量文件重命名脚本【无交互传参版】${gl_bai}"
echo -e "用法: ${gl_lv}$0 [文件名前缀] [后缀1 后缀2 ...]${gl_bai}"
echo ""
echo -e "示例:"
echo -e " 1. 默认前缀pc,重命名所有文件: ${gl_huang}$0${gl_bai}"
echo -e " 2. 自定义前缀file,仅重命名jpg/png文件: ${gl_huang}$0 file jpg png${gl_bai}"
echo -e " 3. 自定义前缀data,重命名所有文件: ${gl_huang}$0 data${gl_bai}"
}
if [[ $# -ge 1 && ($1 == "-h" || $1 == "--help") ]]; then
show_help
exit 0
fi
if [[ $# -ge 1 ]]; then
file_rename_sorter "$1" "${@:2}"
else
file_rename_sorter "pc"
fi
创建本地脚本
new_script="new_test.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
# 保留本地脚本,去掉 rm -f "$new_script"
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"