当前位置: 首页 > news >正文

Linux安全清理删除目录bash脚本

直接写清除目录命令可能会因为一时手抖导致删除重要目录
rm -rf是个危险的命令,我写了bash脚本,放在环境变量目录下可以当系统命令来用

这里是单线程的,如果需要更高的性能,需要加入多线程的支持。

1.实现功能

清理目录的子内容
可选删除目录本身,默认不删除目录
人工二次确认
清理删除白名单(允许操作的目录前缀,我这里默认是/,即不限制,如果要限制,则修改bash脚本)
清理删除黑名单(禁止清理的目录,比如系统目录)
模拟删除,可以仅浏览删除内容,而不真删除
保留一定天数之内的文件
删除时增加日志,清理日志依照时间命名,保存在具体目录(/var/log/clear_path_logs,可在bash脚本修改)
防止清理软连接
带颜色的输出:删除文件高亮绿色输出,删除目录高亮蓝色输出,出错或提示警告高亮红色/黄色输出
没有删除权限的也记录

2.bash脚本内容

vi ./safedel.sh

注意下面的配置区域可以调整

#!/bin/bash# ===================
# 配置区(可根据需要调整)
# ===================
LOG_DIR="/var/log/clear_path_logs"    # 日志集中保存目录
KEEP_LOG_DAYS=7                      # 日志保留天数
DEFAULT_OLD_DAYS=0                   # 默认清理所有
# 清理白名单前缀
ALLOWED_PREFIXES=("/"
)# ===================
# 颜色定义
# ===================
COLOR_RESET="\033[0m"
COLOR_GREEN="\033[32m"
COLOR_BLUE="\033[34m"
COLOR_RED="\033[31m"
COLOR_YELLOW="\033[33m"# ===================
# 开始执行
# ===================# 检查参数
if [ $# -lt 1 ]; thenecho "用法: $0 [--dry-run] [--days=N] [--remove-dir] <要清空的目录>"echo "示例: $0 /var/img/tmp"echo "示例: $0 --dry-run /home/youruser/tmp"echo "示例: $0 --days=30 /var/img/tmp"echo "示例: $0 --remove-dir /var/img/tmp"exit 1
fi# 解析参数
DRY_RUN=0
OLD_DAYS=$DEFAULT_OLD_DAYS
REMOVE_DIR=0while [[ "$1" == --* ]]; docase "$1" in--dry-run)DRY_RUN=1shift;;--days=*)OLD_DAYS="${1#--days=}"shift;;--remove-dir)REMOVE_DIR=1shift;;*)echo -e "${COLOR_RED}未知参数: $1${COLOR_RESET}"exit 1;;esac
done# 目录参数只能放在最后
TARGET_DIR="$1"# 检查目录
if [ -z "$TARGET_DIR" ] || [ ! -d "$TARGET_DIR" ]; thenecho -e "${COLOR_RED}错误: 目录不存在或不是目录: $TARGET_DIR${COLOR_RESET}"exit 1
fi# 防止软链接
if [ -L "$TARGET_DIR" ]; thenecho -e "${COLOR_RED}错误: 目标是软链接,禁止清空软链接指向的内容: $TARGET_DIR${COLOR_RESET}"exit 1
fi# 防止系统目录误删
PROTECTED_DIRS=("/""/boot""/dev""/etc""/home""/lib""/lib64""/proc""/root""/run""/sbin""/sys""/tmp""/usr""/var""/bin""/opt"
)for protected in "${PROTECTED_DIRS[@]}"; doif [ "$TARGET_DIR" = "$protected" ]; thenecho -e "${COLOR_RED}危险: 不允许对关键系统目录执行清空操作: $TARGET_DIR${COLOR_RESET}"exit 1fi
done# 白名单检测
ALLOWED=0
for prefix in "${ALLOWED_PREFIXES[@]}"; docase "$TARGET_DIR" in"$prefix"|"${prefix}/"*)ALLOWED=1break;;esac
doneif [ "$ALLOWED" -ne 1 ]; thenecho -e "${COLOR_RED}错误: 仅允许清理以下目录前缀:${COLOR_RESET}"for prefix in "${ALLOWED_PREFIXES[@]}"; doecho "  - $prefix"doneecho "当前目录: $TARGET_DIR"exit 1
fi# 确保日志目录存在
mkdir -p "$LOG_DIR"# 日志文件
timestamp=$(date +"%Y%m%d_%H%M%S")
log_file="$LOG_DIR/clear_tmp_log_${timestamp}.txt"echo "清理日志 - $(date)" | tee "$log_file"
echo "清理目录: $TARGET_DIR" | tee -a "$log_file"
echo "模拟删除模式: $([ "$DRY_RUN" -eq 1 ] && echo "是" || echo "否")" | tee -a "$log_file"
echo "清理修改时间超过 $OLD_DAYS 天的内容" | tee -a "$log_file"
echo "清理完成后是否删除目录自身: $([ "$REMOVE_DIR" -eq 1 ] && echo "是" || echo "否")" | tee -a "$log_file"
echo "" | tee -a "$log_file"# 确认
echo -e "${COLOR_YELLOW}即将开始清理: $TARGET_DIR${COLOR_RESET}"
read -p "确认要继续吗?(y/n): " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; thenecho "已取消操作。"exit 0
fi# 执行清理
if [ "$OLD_DAYS" -gt 0 ]; thenFIND_CMD=(find "$TARGET_DIR" -mindepth 1 -mtime +"$OLD_DAYS")
elseFIND_CMD=(find "$TARGET_DIR" -mindepth 1)
fi"${FIND_CMD[@]}" | while read -r item; doif [ -d "$item" ]; thenecho -e "${COLOR_BLUE}目录: $item${COLOR_RESET}" | tee -a "$log_file"[ "$DRY_RUN" -eq 0 ] && rm -rf "$item" 2>>"$log_file" || trueelif [ -f "$item" ]; thenecho -e "${COLOR_GREEN}文件: $item${COLOR_RESET}" | tee -a "$log_file"[ "$DRY_RUN" -eq 0 ] && rm -f "$item" 2>>"$log_file" || trueelseecho -e "${COLOR_RED}其他: $item${COLOR_RESET}" | tee -a "$log_file"[ "$DRY_RUN" -eq 0 ] && rm -rf "$item" 2>>"$log_file" || truefi
done# 如果 --remove-dir 参数开启
if [ "$REMOVE_DIR" -eq 1 ]; thenif [ "$DRY_RUN" -eq 0 ]; thenecho -e "${COLOR_RED}删除目标目录本身: $TARGET_DIR${COLOR_RESET}" | tee -a "$log_file"rm -rf "$TARGET_DIR" 2>>"$log_file"elseecho -e "${COLOR_RED}[dry-run] 将删除目录本身: $TARGET_DIR${COLOR_RESET}" | tee -a "$log_file"fi
fiecho "" | tee -a "$log_file"
echo "$([ "$DRY_RUN" -eq 1 ] && echo "模拟")清理完成。" | tee -a "$log_file"
echo "日志保存在: $log_file"# 自动清理老旧日志
find "$LOG_DIR" -type f -name "clear_tmp_log_*.txt" -mtime +"$KEEP_LOG_DAYS" -delete

将其作为一个自定义的系统命令,这样后面可以直接使用safedel命令

mv safedel.sh /usr/local/bin/safedel
chmod +x /usr/local/bin/safedel

3.使用

正常清理目录内内容,不删自身 safedel /var/img/tmp
模拟清理,不删内容 safedel --dry-run /var/img/tmp
只清30天前的内容 safedel --days=30 /var/img/tmp
清完后把目录也删掉 safedel --remove-dir /var/img/tmp
模拟清除+删目录 safedel --dry-run --remove-dir /var/img/tmp

在这里插入图片描述

相关文章:

  • 从零到一构建数据科学全流程实战:最新技术与企业级开发
  • Python:Python3 异常和文件
  • Rerank详解
  • 【CF】Day48——Codeforces Round 979 (Div. 2) D
  • 数字智慧方案5981丨智慧农业解决方案(55页PPT)(文末有下载方式)
  • 2024年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 开始一个vue项目
  • Android 移动开发:ProgressBar (水平进度条)
  • 第十一届蓝桥杯 2020 C/C++组 门牌制作
  • DeepSeek V3 架构创新:大规模MoE与辅助损失移除
  • Java面试高频问题(31-33)
  • PDF24 Tools:涵盖20+种PDF工具,简单高效PDF工具箱,支持一键编辑/转换/合并
  • 【论文阅读26】贝叶斯-滑坡预测-不确定性
  • 当算力遇上堵车:AI如何让城市血管不再“血栓”?
  • 范围for 和 万能引用
  • 8.进程概念(四)
  • 【java WEB】恢复补充说明
  • 权限提升—Linux提权内核溢出漏洞辅助项目
  • 《AIStarter安装部署全攻略:AI绘画/数字人项目快速上手指南(含Windows环境配置要点)》
  • python库文件查找详解
  • 《一鸣惊人》五一特别节目:以戏曲为桥梁,展现劳动者的坚守
  • 向左繁华都市,向右和美乡村,嘉兴如何打造城乡融合发展样本
  • 奔驰一季度利润降四成,受美国加征关税影响放弃全年盈利展望
  • 国台办:“台独”是绝路,外人靠不住
  • 中国人保聘任田耕为副总裁,此前为工行浙江省分行行长
  • 自称“最美”通缉犯出狱当主播?央广网:三观怎能跟着“五官”跑