Linux删除n天以前的文件脚本

Linux删除n天以前的文件脚本

𝓓𝓸𝓷 Lv6

Linux系统自动删除7天以前的文件,Linux自动删除15天以前的文件

一、删除15天以前的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
set -eo pipefail

# ========== 配置区 ==========
BACKUP_DIR="/data/backups" # 备份目录
RETENTION_DAYS=15 # 删多少天前的备份
KEEP_MIN=5 # 强制保留最新几份(防全删)
BACKUP_PATTERN="*.tar.gz" # 备份文件格式(目录备份改为 "202*")
BACKUP_TYPE="f" # f=文件 / d=目录
DRY_RUN=false # true=只打印不删除,先测试再开false
# ============================

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }

# 前置检查
[ ! -d "$BACKUP_DIR" ] && { log "[ERROR] 目录 $BACKUP_DIR 不存在"; exit 1; }

log "===== 开始清理 ====="
$DRY_RUN && log "[WARN] 预演模式,不会实际删除"

# 找所有备份,按时间倒序(最新在前)
backups=()
while IFS= read -r f; do [ -n "$f" ] && backups+=("$f"); done < <(
find "$BACKUP_DIR" -maxdepth 1 -type "$BACKUP_TYPE" -name "$BACKUP_PATTERN" -printf "%T@ %p\n" | sort -nr | cut -d' ' -f2-
)
total=${#backups[@]}
log "共找到 $total 个备份"

# 备份太少直接退出
[ "$total" -le "$KEEP_MIN" ] && { log "[OK] 备份不足 $KEEP_MIN 份,无需清理"; exit 0; }

# 跳过最新KEEP_MIN份,只删后面超期的
now=$(date +%s)
del=0
for ((i=KEEP_MIN; i<total; i++)); do
f="${backups[$i]}"
age=$(( (now - $(stat -c "%Y" "$f")) / 86400 ))
if [ "$age" -gt "$RETENTION_DAYS" ]; then
$DRY_RUN && log "[预演删除] $f (已存${age}天)" || { rm -rf "$f" && log "[已删除] $f (已存${age}天)"; }
((del++))
fi
done

# 清空空目录
$DRY_RUN || find "$BACKUP_DIR" -depth -type d -empty -delete 2>/dev/null

log "本次删除 $del 个过期备份,保留最新至少 $KEEP_MIN 份"
log "===== 清理完成 ====="

一、删除15天以前的文件(美化版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
set -eo pipefail

# ========== 配置区 ==========
BACKUP_DIR="/data/backups" # 备份目录
RETENTION_DAYS=15 # 删多少天前的备份
KEEP_MIN=5 # 强制保留最新几份(防全删)
BACKUP_PATTERN="*.tar.gz" # 备份文件格式(目录备份改为 "202*")
BACKUP_TYPE="f" # f=文件 / d=目录
DRY_RUN=false # true=只打印不删除,先测试再开false
# ============================

# 颜色定义
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
log() { echo -e "${CYAN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"; }

# 前置检查
[ ! -d "$BACKUP_DIR" ] && { log "${RED}❌ 目录 $BACKUP_DIR 不存在${NC}"; exit 1; }

log "===== 🧹 开始清理备份 ====="
$DRY_RUN && log "${YELLOW}⚠️ 预演模式,不会实际删除${NC}"

# 找所有备份,按时间倒序(最新在前)
backups=()
while IFS= read -r f; do [ -n "$f" ] && backups+=("$f"); done < <(
find "$BACKUP_DIR" -maxdepth 1 -type "$BACKUP_TYPE" -name "$BACKUP_PATTERN" -printf "%T@ %p\n" | sort -nr | cut -d' ' -f2-
)
total=${#backups[@]}
log "ℹ️ 共找到 $total 个备份"

# 备份太少直接退出
[ "$total" -le "$KEEP_MIN" ] && { log "${GREEN}✅ 备份不足 $KEEP_MIN 份,无需清理${NC}"; exit 0; }

# 跳过最新KEEP_MIN份,只删后面超期的
now=$(date +%s)
del=0
for ((i=KEEP_MIN; i<total; i++)); do
f="${backups[$i]}"
age=$(( (now - $(stat -c "%Y" "$f")) / 86400 ))
if [ "$age" -gt "$RETENTION_DAYS" ]; then
if $DRY_RUN; then
log "${YELLOW}🔍 待删除:$f (已存${age}天)${NC}"
else
rm -rf "$f" && log "${RED}🗑️ 已删除:$f (已存${age}天)${NC}"
fi
((del++))
fi
done

# 清空空目录
$DRY_RUN || find "$BACKUP_DIR" -depth -type d -empty -delete 2>/dev/null

log "✅ 本次删除 $del 个过期备份,强制保留最新 $KEEP_MIN 份不会清空"
log "===== 🎉 清理完成 ====="

  • Title: Linux删除n天以前的文件脚本
  • Author: 𝓓𝓸𝓷
  • Created at : 2026-11-05 14:26:50
  • Updated at : 2026-11-05 14:53:05
  • Link: https://www.zhangdong.me/linux-delete-files.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
评论