当前位置: 首页 > 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

在这里插入图片描述

http://www.xdnf.cn/news/241921.html

相关文章:

  • 使用scipy求解优化问题
  • Three.js在vue中的使用(一)-基础
  • 报错:函数或变量 ‘calcmie‘ 无法识别。
  • 【网络服务器】——回声服务器(echo)
  • 【C++】类和对象【中下】
  • 【中间件】bthread_基础_TaskControl
  • PyTorch 与 TensorFlow:深度学习框架的深度剖析与实战对比
  • 怎么查看数据库容量
  • REST API、FastAPI与Flask API的对比分析
  • cdn服务器连接异常怎么办?cdn连接失败解决方法有哪些?
  • 深入解析 Python 应用日志监控:ELK、Graylog 的实战指南
  • WPF采集欧姆龙PLC、基恩士PLC、西门子PLC、汇川PLC、台达PLC数据
  • 从请求到响应:初探spring web
  • PCA主成分分析法(最大投影方差,最小重构距离,SVD角度)
  • AI数字人系统开发:技术架构、应用场景与未来趋势
  • 【进阶】--函数栈帧的创建和销毁详解
  • TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记
  • RDMA高性能网络通信实践
  • 航空客户价值分析阶段性测验
  • Python数据分析课程实验-1
  • 使用DCI和RTIT技术进行精准调优--看录像
  • C++之特殊类设计及类型转换
  • 【kafka系列】消费者组
  • 系统架构设计师:设计模式——创建型设计模式
  • 解锁 C++26 的未来:从语言标准演进到实战突破
  • Nginx核心功能——nginx代理
  • 【数据结构】- 栈
  • Vue之脚手架与组件化开发
  • 计算机网络——HTTP/IP 协议通俗入门详解
  • 优雅关闭服务:深入理解 SIGINT / SIGTERM 信号处理机制