实用教程:打造支持参数配置的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=0、NEED_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"
六、注意事项
- 谨慎使用通配符 :尤其是
/*等大范围匹配,建议先使用--dry-run预览匹配结果 - 管理员权限 :删除系统目录(如
C:\windows)文件时,需以管理员身份运行Git Bash - 路径格式 :Git Bash中Windows路径需使用
/c/、/d/格式,而非C:\、D:\ - 重要文件备份:清理前建议备份重要文件,避免误删无法恢复