实用教程:打造支持参数配置的 Git Bash 文件清理脚本

实用教程:打造支持参数配置的Git Bash文件清理脚本

开发时,我们经常需要清理指定目录下的临时文件、日志文件或 dump 文件等。手动删除不仅繁琐,还容易误删重要文件。今天就来教大家打造一个支持参数传入、带安全校验、可灵活配置 的Git Bash文件清理脚本,轻松解决文件清理难题。

一、脚本核心特性

本次开发的清理脚本具备以下实用特性,兼顾安全性和灵活性:

  • ✅ 支持Windows路径格式(如 /c/windows/dump*.dump)和通配符匹配
  • ✅ 可通过命令行参数配置「模拟执行」和「删除确认」(不传入则使用默认值)
  • ✅ 自动校验文件存在性,避免删除不存在的文件
  • ✅ 友好的日志输出,清晰展示删除进度和结果
  • ✅ 支持多路径同时清理,处理含空格的文件路径
  • ✅ 安全防护:默认开启删除确认,防止误操作

二、完整脚本代码

将以下代码保存为 clean_files.sh(建议放在用户目录 ~/ 下,方便全局调用):

bash 复制代码
#!/bin/bash

# 清理指定目录文件的 Git Bash 脚本(Windows 最终版)
# 核心:手动指定你的 Git 命令实际路径,100% 匹配
# 解决:命令路径不匹配、PATH污染、文件不换行、权限不足等所有问题
# 用法:./clean_files.sh [选项] <目标文件路径>

##############################################################################
# 关键配置:手动填写你的 Git 命令路径(已根据你的环境填写)
##############################################################################
# 你的 Git 实际路径:C:\Program Files\Git\usr\bin
# 对应 Git Bash 虚拟路径:/c/Program Files/Git/usr/bin/
GIT_BIN_PATH="/c/Program Files/Git/usr/bin"
# 拼接命令路径(带 .exe 后缀,Windows 必需)
RM_CMD="$GIT_BIN_PATH/rm.exe"
DATE_CMD="$GIT_BIN_PATH/date.exe"

# shopt 是 Bash 内置命令,无需路径
SHOPT_CMD="shopt"

##############################################################################
# 基础配置(无需修改)
##############################################################################
DRY_RUN=0             # 1=模拟执行(只显示不删除),0=实际执行
NEED_CONFIRM=1        # 1=需要确认,0=直接删除
FILE_COUNT=0          # 统计匹配文件总数
MATCHED_FILES=()      # 存储匹配文件路径

##############################################################################
# 函数:显示帮助信息
##############################################################################
show_help() {
    echo "========================================"
    echo "  Windows Git Bash 文件清理脚本 v1.9(最终完美版)"
    echo "========================================"
    echo "  特性:手动指定 Git 命令路径,完全匹配你的环境"
    echo "  当前 Git 命令路径:$GIT_BIN_PATH"
    echo "  支持:Windows路径(/c/...)、通配符、含空格路径"
    echo "  用法:$0 [选项] <目标文件路径>"
    echo "  "
    echo "  选项说明:"
    echo "    --dry-run        模拟执行(仅预览,不删除)"
    echo "    --no-dry-run     实际执行删除(默认)"
    echo "    --confirm        删除前确认(默认)"
    echo "    --no-confirm     无需确认,直接删除"
    echo "    -h/--help        显示帮助信息"
    echo "  "
    echo "  示例用法:"
    echo "    $0 --dry-run /c/Windows/Temp/dump*.dmp"
    echo "    $0 --no-confirm /d/data/*.log"
    echo "========================================"
}

##############################################################################
# 函数:解析命令行参数(Bash 内置)
##############################################################################
parse_args() {
    TARGET_PATHS=()
    for ARG in "$@"; do
        case "$ARG" in
            --dry-run)
                DRY_RUN=1
                ;;
            --no-dry-run)
                DRY_RUN=0
                ;;
            --confirm)
                NEED_CONFIRM=1
                ;;
            --no-confirm)
                NEED_CONFIRM=0
                ;;
            -h|--help)
                show_help
                exit 0
                ;;
            *)
                TARGET_PATHS+=("$ARG")
                ;;
        esac
    done

    # 校验目标路径参数
    if [ ${#TARGET_PATHS[@]} -eq 0 ]; then
        echo "❌ 错误:未传入目标文件路径参数"
        show_help
        exit 1
    fi
}

##############################################################################
# 函数:匹配文件并存储(纯 Bash 内置)
##############################################################################
match_files() {
    MATCHED_FILES=()
    FILE_COUNT=0

    # 开启 nullglob,处理通配符
    $SHOPT_CMD -s nullglob

    for PATH in "${TARGET_PATHS[@]}"; do
        for FILE in "$PATH"; do
            # 确认是文件
            if [ -f "$FILE" ]; then
                MATCHED_FILES+=("$FILE")
                ((FILE_COUNT++))
            fi
        done
    done

    $SHOPT_CMD -u nullglob

    # 无匹配文件退出
    if [ $FILE_COUNT -eq 0 ]; then
        echo "ℹ️  没有找到匹配的文件:${TARGET_PATHS[*]}"
        exit 0
    fi
}

##############################################################################
# 函数:强制换行显示文件列表
##############################################################################
show_matched_files() {
    echo -e "\n⚠️  已匹配以下 $FILE_COUNT 个文件(强制每行一个):"
    for FILE in "${MATCHED_FILES[@]}"; do
        echo "  - $FILE"
    done

    echo -e "\nℹ️  执行配置:"
    echo "  - 模拟执行:$( [ $DRY_RUN -eq 1 ] && echo "✅ 是" || echo "❌ 否" )"
    echo "  - 需要确认:$( [ $NEED_CONFIRM -eq 1 ] && echo "✅ 是" || echo "❌ 否" )"
    echo "  - rm 命令路径:$RM_CMD"
    echo "  - 命令是否存在:$( [ -f "$RM_CMD" ] && echo "✅ 存在" || echo "❌ 不存在" )"
    echo
}

##############################################################################
# 函数:确认删除操作
##############################################################################
confirm_delete() {
    if [ $NEED_CONFIRM -eq 1 ]; then
        read -p "❓ 确定要执行上述操作吗?(y/N) " CONFIRM
        if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
            echo "✅ 操作已取消"
            exit 0
        fi
    fi
}

##############################################################################
# 函数:执行删除操作(最终匹配你的环境)
##############################################################################
execute_delete() {
    # 先检查 rm 命令是否存在
    if [ ! -f "$RM_CMD" ]; then
        echo "❌ 错误:rm 命令路径不存在,请检查 GIT_BIN_PATH 配置"
        echo "  当前配置路径:$GIT_BIN_PATH"
        echo "  正确路径应为:你的 Git 安装目录下的 usr/bin(如 /c/Program Files/Git/usr/bin)"
        exit 1
    fi

    if [ $DRY_RUN -eq 1 ]; then
        echo "ℹ️  模拟执行完成(未实际删除任何文件)"
        return
    fi

    echo "🗑️  开始删除文件(每行一个结果)..."
    SUCCESS_COUNT=0
    FAIL_COUNT=0

    # 使用手动指定的 rm 命令路径删除
    for FILE in "${MATCHED_FILES[@]}"; do
        "$RM_CMD" -f "$FILE"
        if [ $? -eq 0 ]; then
            echo "  ✅ 已删除:$FILE"
            ((SUCCESS_COUNT++))
        else
            echo "  ❌ 删除失败:$FILE"
            echo "      原因:未以管理员身份运行 Git Bash!"
            echo "      解决:右键 Git Bash → 以管理员身份运行 → 重新执行脚本"
            ((FAIL_COUNT++))
        fi
    done

    echo -e "\n🎉 操作完成!"
    echo "  - 成功删除:$SUCCESS_COUNT 个文件"
    echo "  - 删除失败:$FAIL_COUNT 个文件"
    echo "  - 总匹配文件:$FILE_COUNT 个"
}

##############################################################################
# 主执行流程
##############################################################################
main() {
    # 显示当前时间
    if [ -f "$DATE_CMD" ]; then
        CURRENT_TIME=$("$DATE_CMD" +'%Y-%m-%d %H:%M:%S')
    else
        CURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')
    fi

    echo "========================================"
    echo "  Windows Git Bash 文件清理工具"
    echo "  执行时间:$CURRENT_TIME"
    echo "  Git 命令路径:$GIT_BIN_PATH"
    echo "========================================"

    # 1. 解析参数
    parse_args "$@"

    # 2. 匹配文件
    match_files

    # 3. 显示文件列表
    show_matched_files

    # 4. 确认删除
    confirm_delete

    # 5. 执行删除
    execute_delete
}

# 启动主流程
main "$@"

三、脚本使用步骤

1. 准备工作:添加执行权限

打开Git Bash,进入脚本所在目录(如用户目录 ~/),执行以下命令添加执行权限:

bash 复制代码
chmod +x ~/clean_files.sh

2. 基础使用示例

脚本支持多种场景的文件清理,以下是最常用的几个示例:

示例1:默认配置清理(需确认+实际删除)

清理 C:\windows 目录下所有 .dump 文件(Git Bash中Windows路径需写为 /c/windows/):

bash 复制代码
~/clean_files.sh /c/windows/dump*.dump

执行后会先显示匹配的文件列表,然后提示确认,确认后才会实际删除。

示例2:模拟执行(预览删除列表)

想先看看会删除哪些文件,不实际执行删除操作,使用 --dry-run 参数:

bash 复制代码
~/clean_files.sh --dry-run /d/data/*.log

执行后只会显示待删除文件列表和配置,不会删除任何文件,适合风险校验。

示例3:直接删除(无需确认)

对于确定要删除的文件,可使用 --no-confirm 参数跳过确认步骤:

bash 复制代码
~/clean_files.sh --no-confirm ~/project/*.tmp
示例4:多路径同时清理

同时清理多个目录下的文件,用空格分隔路径即可:

bash 复制代码
~/clean_files.sh /c/temp/*.log /d/docs/*.old ~/downloads/*.zip
示例5:处理含空格的路径

如果文件路径包含空格,需要用引号包裹路径:

bash 复制代码
~/clean_files.sh --no-confirm "/c/Program Files/*.log"

3. 选项参数组合使用

脚本支持多个选项参数组合,满足更灵活的需求:

bash 复制代码
# 模拟执行 + 无需确认(快速预览删除列表)
~/clean_files.sh --dry-run --no-confirm *.log

# 实际执行 + 强制确认(即使默认已开启确认,显式指定更清晰)
~/clean_files.sh --no-dry-run --confirm /c/windows/dump*.dump

四、脚本核心逻辑解析

1. 参数解析机制

脚本通过 parse_args 函数解析命令行参数,区分「选项参数」(如 --dry-run)和「路径参数」,未传入选项时使用默认配置(DRY_RUN=0NEED_CONFIRM=1)。

2. 安全校验逻辑

  • 文件存在性校验 :通过 find 命令查找匹配文件,排除目录,避免删除文件夹
  • 权限错误忽略2>/dev/null 屏蔽权限不足的错误提示,不影响脚本执行
  • 空匹配处理:未找到匹配文件时友好提示并退出,不执行后续操作

3. 执行流程控制

脚本执行流程清晰,按「解析参数→校验文件→显示列表→确认操作→执行删除」逐步推进,每个步骤都有明确的日志输出,方便排查问题。

五、进阶技巧:定制与扩展

1. 修改默认配置

如果经常使用某类配置,可直接修改脚本开头的默认配置:

bash 复制代码
# 例如:默认开启模拟执行,默认无需确认
DRY_RUN=1
NEED_CONFIRM=0

2. 添加全局调用

将脚本所在目录添加到环境变量,即可在任意目录下直接执行 clean_files.sh,无需输入路径:

bash 复制代码
# 编辑环境变量配置文件
vi ~/.bashrc
# 添加以下内容(假设脚本在 ~/ 目录)
export PATH="$PATH:~/"
# 生效配置
source ~/.bashrc

之后在任意目录下可直接执行:

bash 复制代码
clean_files.sh --dry-run /c/windows/dump*.dump

3. 扩展功能:添加日志保存

如果需要记录删除日志,可修改 execute_delete 函数,将输出重定向到日志文件:

bash 复制代码
# 在 execute_delete 函数开头添加日志文件路径
LOG_FILE="clean_log_$(date +'%Y%m%d_%H%M%S').log"
# 执行删除时同时写入日志
rm -f "$FILE" 2>&1 | tee -a "$LOG_FILE"

六、注意事项

  1. 谨慎使用通配符 :尤其是 /* 等大范围匹配,建议先使用 --dry-run 预览匹配结果
  2. 管理员权限 :删除系统目录(如 C:\windows)文件时,需以管理员身份运行Git Bash
  3. 路径格式 :Git Bash中Windows路径需使用 /c//d/ 格式,而非 C:\D:\
  4. 重要文件备份:清理前建议备份重要文件,避免误删无法恢复
相关推荐
提娜米苏2 小时前
Bash Shell脚本学习——唇读数据集验证脚本
开发语言·学习·bash
lkbhua莱克瓦242 小时前
Java基础——集合进阶5
java·开发语言·集合·泛型
聪明努力的积极向上3 小时前
【C#】System.Text.Encoding.Default 属性在framework和.netcore中的区别
开发语言·c#·.netcore
夕泠爱吃糖3 小时前
template关键字
开发语言·c++·template
ceclar1233 小时前
C++文件操作
开发语言·c++
高一要励志成为佬4 小时前
【C++】vector的迭代器失效问题,(什么是迭代器失效,为什么会产生迭代器失效,怎么避免迭代器失效问题)
开发语言·c++
CaracalTiger4 小时前
本地部署 Stable Diffusion3.5!cpolar让远程访问很简单!
java·linux·运维·开发语言·python·微信·stable diffusion
whm27774 小时前
Visual Basic 创建状态栏
开发语言·visual studio
api_180079054605 小时前
【技术教程】Python/Node.js 调用拼多多商品详情 API 示例详解
大数据·开发语言·python·数据挖掘·node.js