本文目录导读:

这个问题需要根据你使用的操作系统和具体场景(日志文件、备份文件、临时文件)来回答,下面提供几种最常用的脚本设置方法。
核心原则
文件保留时长通常通过以下两种逻辑实现:
- 按时间删除:查找
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+任务计划程序
只要按照上面的示例将脚本、变量和定时任务设置好,就能实现自动化的文件保留时长管理。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播