本文目录导读:

这个问题需要根据你使用的操作系统和具体场景(日志文件、备份文件、临时文件)来回答,下面提供几种最常用的脚本设置方法。
核心原则
文件保留时长通常通过以下两种逻辑实现:
- 按时间删除:查找
N天前创建/修改的文件并删除。 - 按数量删除:保留最新的
N个文件,删除更旧的。
Linux / macOS (Bash 脚本)
这是最常见的情况,主要使用 find 命令。
删除 X 天前的文件
示例:保留最近 7 天的日志文件,删除更早的。
#!/bin/bash # 设置要清理的目录和保留天数 TARGET_DIR="/var/log/myapp" RETENTION_DAYS=7 # 查找并删除 7 天前的 .log 文件 find "$TARGET_DIR" -name "*.log" -type f -mtime +$RETENTION_DAYS -delete
-mtime +7:文件修改时间在 7 天之前。(+7表示大于 7 天,7表示正好 7 天)-atime:访问时间-ctime:状态改变时间-delete:直接删除(慎用!,可以先去掉-delete,加上-print预览结果)
安全预览版(先看看会删掉什么,避免误删):
find "$TARGET_DIR" -name "*.log" -type f -mtime +7 -print
只保留最新的 N 个文件
示例:保留目录下最新的 5 个备份文件,删除其余所有。
#!/bin/bash
TARGET_DIR="/backups"
FILE_PATTERN="*.tar.gz"
KEEP_COUNT=5
# 列出文件按时间排序,跳过前 KEEP_COUNT 个,然后删除
ls -1t "$TARGET_DIR"/$FILE_PATTERN | tail -n +$((KEEP_COUNT + 1)) | while read file; do
rm -f "$TARGET_DIR/$file"
done
ls -1t:按时间倒序(最新在前)列出文件。tail -n +7:从第 7 行开始输出(即跳过前 6 个,只保留 6 个需要调整)。
Windows (PowerShell)
删除 X 天前的文件
示例:删除 C:\Logs\ 中 30 天前的 .txt 文件。
# 设置路径和天数
$Path = "C:\Logs"
$Days = 30
$CutoffDate = (Get-Date).AddDays(-$Days)
# 获取并删除文件
Get-ChildItem -Path $Path -Filter "*.txt" -Recurse |
Where-Object { $_.LastWriteTime -lt $CutoffDate } |
Remove-Item -Force -WhatIf # 安全模式,预览删除内容,确认无误后去掉 -WhatIf
-WhatIf:极其重要,模拟执行,只显示会删什么,不真删,去掉后才真正删除。LastWriteTime:最后修改时间,也可以用CreationTime或LastAccessTime。
真正执行版:
Get-ChildItem -Path "C:\Backups\*.bak" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-14) } |
Remove-Item -Force
保留最新的 N 个文件
$Path = "C:\Backups" $Keep = 10 $Pattern = "*.zip" Get-ChildItem -Path $Path -Filter $Pattern | Sort-Object LastWriteTime -Descending | Select-Object -Skip $Keep | Remove-Item -Force
Windows 传统 (批处理 .bat)
局限性:批处理对日期的计算能力很弱,通常需要借助 forfiles 命令。
场景:删除 7 天前的文件
@echo off rem 设置目录和天数 set "TARGET_DIR=C:\Logs" set "DAYS=-7" rem 使用 forfiles 命令 forfiles /p "%TARGET_DIR%" /m *.log /d %DAYS% /c "cmd /c del @path"
/d -7:表示所有修改时间在 7 天前的文件。- 注意:
forfiles在较老的 Windows 版本(如 Windows 7)可能存在,但在某些精简版或家庭版中可能缺失,推荐使用 PowerShell。
如何让脚本“定时”运行(自动执行)
设置好脚本只是第一步,还需要让它定期自动执行。
Linux / macOS: Crontab (定时任务)
# 编辑 crontab crontab -e # 每天早上 3:00 执行清理脚本 0 3 * * * /path/to/cleanup_script.sh
Windows: 任务计划程序
- 打开 任务计划程序。
- “创建基本任务”。
- 设置触发器(每天、每周)。
- 设置操作:“启动程序”,浏览选择你的
.ps1或.bat脚本。 - 关键:如果使用 PowerShell 脚本,操作设置为
powershell.exe,参数填写-File "C:\path\to\script.ps1" -ExecutionPolicy Bypass。
高级技巧与注意事项
-
日志审计:建议在脚本里加入日志记录功能,记录删了哪些文件,方便排查。
# Linux 示例:记录删除操作 find "$TARGET_DIR" -name "*.log" -mtime +7 -delete -print > /var/log/cleanup.log 2>&1
-
防止删除正在使用的文件(Linux):
- 使用
fuser或lsof检查文件是否被进程占用,确保不删除正在写入的日志。find "$TARGET_DIR" -name "*.log" -mtime +7 | while read f; do if ! fuser -s "$f" 2>/dev/null; then rm "$f" fi done
- 使用
-
慎用
-delete或Remove-Item:- 永远先运行测试命令(
find ... -print,ls ...)或加上-WhatIf参数。 - 使用
-type f限制只删文件,防止误删目录结构。
- 永远先运行测试命令(
-
时间粒度:
- 如果文件修改时间可能被意外修改(如压缩、移动),可以使用
-ctime(状态改变时间)或文件的创建时间。
- 如果文件修改时间可能被意外修改(如压缩、移动),可以使用
- Linux 首选:
find + mtime + -delete+crontab - Windows 首选:
PowerShell + Where-Object + Remove-Item+任务计划程序
只要按照上面的示例将脚本、变量和定时任务设置好,就能实现自动化的文件保留时长管理。