脚本如何设置文件保留时长

wen 实用脚本 27

本文目录导读:

脚本如何设置文件保留时长

  1. 核心原则
  2. Linux / macOS (Bash 脚本)
  3. Windows (PowerShell)
  4. Windows 传统 (批处理 .bat)
  5. 如何让脚本“定时”运行(自动执行)
  6. 高级技巧与注意事项

这个问题需要根据你使用的操作系统具体场景(日志文件、备份文件、临时文件)来回答,下面提供几种最常用的脚本设置方法。

核心原则

文件保留时长通常通过以下两种逻辑实现:

  1. 按时间删除:查找 N 天前创建/修改的文件并删除。
  2. 按数量删除:保留最新的 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:最后修改时间,也可以用 CreationTimeLastAccessTime

真正执行版

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: 任务计划程序

  1. 打开 任务计划程序
  2. “创建基本任务”。
  3. 设置触发器(每天、每周)。
  4. 设置操作:“启动程序”,浏览选择你的 .ps1.bat 脚本。
  5. 关键:如果使用 PowerShell 脚本,操作设置为 powershell.exe,参数填写 -File "C:\path\to\script.ps1" -ExecutionPolicy Bypass

高级技巧与注意事项

  1. 日志审计:建议在脚本里加入日志记录功能,记录删了哪些文件,方便排查。

    # Linux 示例:记录删除操作
    find "$TARGET_DIR" -name "*.log" -mtime +7 -delete -print > /var/log/cleanup.log 2>&1
  2. 防止删除正在使用的文件(Linux):

    • 使用 fuserlsof 检查文件是否被进程占用,确保不删除正在写入的日志。
      find "$TARGET_DIR" -name "*.log" -mtime +7 | while read f; do
      if ! fuser -s "$f" 2>/dev/null; then
      rm "$f"
      fi
      done
  3. 慎用 -deleteRemove-Item

    • 永远先运行测试命令(find ... -printls ...)或加上 -WhatIf 参数。
    • 使用 -type f 限制只删文件,防止误删目录结构。
  4. 时间粒度

    • 如果文件修改时间可能被意外修改(如压缩、移动),可以使用 -ctime(状态改变时间)或文件的创建时间。
  • Linux 首选find + mtime + -delete + crontab
  • Windows 首选PowerShell + Where-Object + Remove-Item + 任务计划程序

只要按照上面的示例将脚本、变量和定时任务设置好,就能实现自动化的文件保留时长管理。

抱歉,评论功能暂时关闭!