随机
Enter 搜索 ↑↓ 切换 Esc 清空

file_rename_sorter

脚本

文件重命名排序工具

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 仅处理指定后缀文件

效果预览

执行脚本效果预览

执行脚本效果预览

补充说明

该脚本用于批量文件重命名排序,将当前目录下的文件按顺序重命名为 前缀-序号.后缀 格式,适合需要批量整理文件名的场景。

功能特点

输出说明

脚本输出包含以下字段:

字段 说明
文件名前缀 显示用户输入或默认的文件名前缀
匹配模式 显示匹配全部文件或指定后缀
待处理文件数 显示匹配到的文件总数
移动进度 显示文件移动到临时文件夹的进度
重命名进度 显示文件重命名的进度(原文件名 → 新文件名)
处理结果 显示成功重命名的文件数量
状态提示 [信息]、[成功]、[警告]、[错误] 等彩色提示信息

注意事项

脚本源码

#!/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"