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


一、脚本核心特性
本次开发的清理脚本具备以下实用特性,兼顾安全性和灵活性:
- ✅ 支持Windows路径格式(如
/c/windows/dump*.dump)和通配符匹配 - ✅ 可通过命令行参数配置「模拟执行」和「删除确认」(不传入则使用默认值)
- ✅ 自动校验文件存在性,避免删除不存在的文件
- ✅ 友好的日志输出,清晰展示删除进度和结果
- ✅ 支持多路径同时清理,处理含空格的文件路径
- ✅ 安全防护:默认开启删除确认,防止误操作
二、完整脚本代码
将以下代码保存为 clean_files.sh(建议放在用户目录 ~/ 下,方便全局调用):
#!/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 "$@"; docase "$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_helpexit 0;;*)TARGET_PATHS+=("$ARG");;esacdone# 校验目标路径参数if [ ${#TARGET_PATHS[@]} -eq 0 ]; thenecho "❌ 错误:未传入目标文件路径参数"show_helpexit 1fi
}##############################################################################
# 函数:匹配文件并存储(纯 Bash 内置)
##############################################################################
match_files() {MATCHED_FILES=()FILE_COUNT=0# 开启 nullglob,处理通配符$SHOPT_CMD -s nullglobfor PATH in "${TARGET_PATHS[@]}"; dofor FILE in "$PATH"; do# 确认是文件if [ -f "$FILE" ]; thenMATCHED_FILES+=("$FILE")((FILE_COUNT++))fidonedone$SHOPT_CMD -u nullglob# 无匹配文件退出if [ $FILE_COUNT -eq 0 ]; thenecho "ℹ️ 没有找到匹配的文件:${TARGET_PATHS[*]}"exit 0fi
}##############################################################################
# 函数:强制换行显示文件列表
##############################################################################
show_matched_files() {echo -e "\n⚠️ 已匹配以下 $FILE_COUNT 个文件(强制每行一个):"for FILE in "${MATCHED_FILES[@]}"; doecho " - $FILE"doneecho -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 ]; thenread -p "❓ 确定要执行上述操作吗?(y/N) " CONFIRMif [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; thenecho "✅ 操作已取消"exit 0fifi
}##############################################################################
# 函数:执行删除操作(最终匹配你的环境)
##############################################################################
execute_delete() {# 先检查 rm 命令是否存在if [ ! -f "$RM_CMD" ]; thenecho "❌ 错误:rm 命令路径不存在,请检查 GIT_BIN_PATH 配置"echo " 当前配置路径:$GIT_BIN_PATH"echo " 正确路径应为:你的 Git 安装目录下的 usr/bin(如 /c/Program Files/Git/usr/bin)"exit 1fiif [ $DRY_RUN -eq 1 ]; thenecho "ℹ️ 模拟执行完成(未实际删除任何文件)"returnfiecho "🗑️ 开始删除文件(每行一个结果)..."SUCCESS_COUNT=0FAIL_COUNT=0# 使用手动指定的 rm 命令路径删除for FILE in "${MATCHED_FILES[@]}"; do"$RM_CMD" -f "$FILE"if [ $? -eq 0 ]; thenecho " ✅ 已删除:$FILE"((SUCCESS_COUNT++))elseecho " ❌ 删除失败:$FILE"echo " 原因:未以管理员身份运行 Git Bash!"echo " 解决:右键 Git Bash → 以管理员身份运行 → 重新执行脚本"((FAIL_COUNT++))fidoneecho -e "\n🎉 操作完成!"echo " - 成功删除:$SUCCESS_COUNT 个文件"echo " - 删除失败:$FAIL_COUNT 个文件"echo " - 总匹配文件:$FILE_COUNT 个"
}##############################################################################
# 主执行流程
##############################################################################
main() {# 显示当前时间if [ -f "$DATE_CMD" ]; thenCURRENT_TIME=$("$DATE_CMD" +'%Y-%m-%d %H:%M:%S')elseCURRENT_TIME=$(date +'%Y-%m-%d %H:%M:%S')fiecho "========================================"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,进入脚本所在目录(如用户目录 ~/),执行以下命令添加执行权限:
chmod +x ~/clean_files.sh
2. 基础使用示例
脚本支持多种场景的文件清理,以下是最常用的几个示例:
示例1:默认配置清理(需确认+实际删除)
清理 C:\windows 目录下所有 .dump 文件(Git Bash中Windows路径需写为 /c/windows/):
~/clean_files.sh /c/windows/dump*.dump
执行后会先显示匹配的文件列表,然后提示确认,确认后才会实际删除。
示例2:模拟执行(预览删除列表)
想先看看会删除哪些文件,不实际执行删除操作,使用 --dry-run 参数:
~/clean_files.sh --dry-run /d/data/*.log
执行后只会显示待删除文件列表和配置,不会删除任何文件,适合风险校验。
示例3:直接删除(无需确认)
对于确定要删除的文件,可使用 --no-confirm 参数跳过确认步骤:
~/clean_files.sh --no-confirm ~/project/*.tmp
示例4:多路径同时清理
同时清理多个目录下的文件,用空格分隔路径即可:
~/clean_files.sh /c/temp/*.log /d/docs/*.old ~/downloads/*.zip
示例5:处理含空格的路径
如果文件路径包含空格,需要用引号包裹路径:
~/clean_files.sh --no-confirm "/c/Program Files/*.log"
3. 选项参数组合使用
脚本支持多个选项参数组合,满足更灵活的需求:
# 模拟执行 + 无需确认(快速预览删除列表)
~/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=0、NEED_CONFIRM=1)。
2. 安全校验逻辑
- 文件存在性校验:通过
find命令查找匹配文件,排除目录,避免删除文件夹 - 权限错误忽略:
2>/dev/null屏蔽权限不足的错误提示,不影响脚本执行 - 空匹配处理:未找到匹配文件时友好提示并退出,不执行后续操作
3. 执行流程控制
脚本执行流程清晰,按「解析参数→校验文件→显示列表→确认操作→执行删除」逐步推进,每个步骤都有明确的日志输出,方便排查问题。
五、进阶技巧:定制与扩展
1. 修改默认配置
如果经常使用某类配置,可直接修改脚本开头的默认配置:
# 例如:默认开启模拟执行,默认无需确认
DRY_RUN=1
NEED_CONFIRM=0
2. 添加全局调用
将脚本所在目录添加到环境变量,即可在任意目录下直接执行 clean_files.sh,无需输入路径:
# 编辑环境变量配置文件
vi ~/.bashrc
# 添加以下内容(假设脚本在 ~/ 目录)
export PATH="$PATH:~/"
# 生效配置
source ~/.bashrc
之后在任意目录下可直接执行:
clean_files.sh --dry-run /c/windows/dump*.dump
3. 扩展功能:添加日志保存
如果需要记录删除日志,可修改 execute_delete 函数,将输出重定向到日志文件:
# 在 execute_delete 函数开头添加日志文件路径
LOG_FILE="clean_log_$(date +'%Y%m%d_%H%M%S').log"
# 执行删除时同时写入日志
rm -f "$FILE" 2>&1 | tee -a "$LOG_FILE"
六、注意事项
- 谨慎使用通配符:尤其是
/*等大范围匹配,建议先使用--dry-run预览匹配结果 - 管理员权限:删除系统目录(如
C:\windows)文件时,需以管理员身份运行Git Bash - 路径格式:Git Bash中Windows路径需使用
/c/、/d/格式,而非C:\、D:\ - 重要文件备份:清理前建议备份重要文件,避免误删无法恢复
