自动化脚本如何清理临时文件

wen 实用脚本 1

本文目录导读:

自动化脚本如何清理临时文件

  1. Windows 环境(PowerShell / bat)
  2. Linux 环境(Bash)
  3. macOS 环境(Bash + osascript)
  4. 跨平台通用方案(Python)
  5. 通用安全准则与注意事项
  6. 自动化部署建议

Windows 环境(PowerShell / bat)

Windows 系统的临时文件主要分布在 %TEMP%C:\Windows\Temp 以及部分软件缓存目录。

使用 PowerShell(推荐,更强大安全)

# 清理当前用户临时文件夹(%TEMP%)
$tempPaths = @(
    "$env:TEMP",
    "$env:WINDIR\Temp",
    "$env:USERPROFILE\AppData\Local\Temp"
)
foreach ($path in $tempPaths) {
    if (Test-Path $path) {
        try {
            # 删除文件(排除正在使用的)
            Get-ChildItem -Path $path -Recurse -Force -ErrorAction SilentlyContinue |
            Where-Object { !$_.PSIsContainer } |
            Remove-Item -Force -ErrorAction SilentlyContinue
            # 删除空目录
            Get-ChildItem -Path $path -Recurse -Force -ErrorAction SilentlyContinue |
            Where-Object { $_.PSIsContainer -and @(Get-ChildItem -LiteralPath $_.Fullname -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { !$_.PSIsContainer }).Count -eq 0 } |
            Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
        }
        catch {
            Write-Warning "清理 $path 时出错: $_"
        }
    }
}
Write-Host "临时文件清理完成(部分文件可能因占用而跳过)"

使用批处理脚本(传统方式)

@echo off
echo 正在清理临时文件...
:: 清理当前用户临时文件夹
del /f /s /q %TEMP%\*.* > nul 2>&1
for /d %%i in (%TEMP%\*) do rd /s /q "%%i" > nul 2>&1
:: 清理系统临时文件夹(需要管理员权限)
del /f /s /q C:\Windows\Temp\*.* > nul 2>&1
for /d %%i in (C:\Windows\Temp\*) do rd /s /q "%%i" > nul 2>&1
:: 清理预取文件(谨慎,可选)
del /f /s /q C:\Windows\Prefetch\*.* > nul 2>&1
echo 清理完成!
pause

注意:批处理脚本中 delrd 的错误输出被重定向到 nul,避免因文件占用而弹出错误信息。

清理其他常见系统残留(PowerShell)

# 清理 Windows 更新缓存(需要管理员权限)
if ([Security.Principal.WindowsIdentity]::GetCurrent().Groups -match "S-1-5-32-544") {
    Write-Host "清理 Windows 更新缓存..."
    Stop-Service -Name wuauserv -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "$env:WINDIR\SoftwareDistribution\Download\*" -Recurse -Force -ErrorAction SilentlyContinue
    Start-Service -Name wuauserv -ErrorAction SilentlyContinue
} else {
    Write-Warning "需要管理员权限才能清理 Windows 更新缓存。"
}
# 清理回收站(清空)
Clear-RecycleBin -Force -ErrorAction SilentlyContinue

Linux 环境(Bash)

Linux 的临时文件通常位于 /tmp/var/tmp、用户家目录的 .cache 以及其他应用缓存。

通用临时文件清理脚本

#!/bin/bash
# 使用前请确认你有权限,建议以 root 或普通用户区分执行
echo "开始清理临时文件..."
# 1. 清理 /tmp(注意:不要删除 /tmp 本身!)
# 删除 7 天前的文件和目录(更安全的做法)
find /tmp -type f -atime +7 -delete 2>/dev/null
find /tmp -type d -empty -delete 2>/dev/null
# 2. 清理 /var/tmp
find /var/tmp -type f -atime +7 -delete 2>/dev/null
find /var/tmp -type d -empty -delete 2>/dev/null
# 3. 清理用户缓存(只能由对应用户执行,或以 root 身份遍历家目录)
# 如果以 root 运行,清理所有用户的 .cache 和 .thumbnails
if [ "$EUID" -eq 0 ]; then
    echo "以 root 身份清理用户缓存..."
    for user_home in /home/* /root; do
        if [ -d "$user_home/.cache" ]; then
            find "$user_home/.cache" -type f -atime +30 -delete 2>/dev/null
        fi
        if [ -d "$user_home/.thumbnails" ]; then
            rm -rf "$user_home/.thumbnails/"* 2>/dev/null
        fi
    done
else
    # 普通用户清理自己的
    echo "清理当前用户的缓存..."
    find ~/.cache -type f -atime +30 -delete 2>/dev/null
    rm -rf ~/.thumbnails/* 2>/dev/null
fi
# 4. 清理 apt 缓存(Debian/Ubuntu)
if command -v apt &> /dev/null; then
    echo "清理 APT 缓存..."
    apt-get clean -y 2>/dev/null
fi
# 5. 清理 journal 日志(保留 100M)
if command -v journalctl &> /dev/null; then
    echo "清理系统日志(保留 100M)..."
    journalctl --vacuum-size=100M 2>/dev/null
fi
echo "清理完成!"

针对特定应用的清理

#!/bin/bash
# 清理 Docker 相关临时文件(需要 docker 权限)
echo "清理 Docker 系统资源..."
docker system prune -f 2>/dev/null
# 清理 pip 缓存
echo "清理 pip 缓存..."
pip cache purge 2>/dev/null
# 清理 npm 缓存
echo "清理 npm 缓存..."
npm cache clean --force 2>/dev/null

macOS 环境(Bash + osascript)

macOS 基于 Unix,但部分目录受 SIP 保护。

#!/bin/bash
echo "开始清理 macOS 临时文件..."
# 1. 系统临时目录(/tmp 和 /var/tmp)
sudo find /tmp -type f -atime +7 -delete 2>/dev/null
sudo find /var/tmp -type f -atime +7 -delete 2>/dev/null
# 2. 用户缓存
find ~/Library/Caches -type f -atime +30 -delete 2>/dev/null
find ~/Library/Logs -type f -mtime +30 -delete 2>/dev/null
# 3. 清空废纸篓(需要用户确认)
osascript -e 'tell application "Finder" to empty trash'
# 4. 清理 Xcode 衍生数据(如果有)
if [ -d ~/Library/Developer/Xcode/DerivedData ]; then
    echo "清理 Xcode 构建缓存..."
    rm -rf ~/Library/Developer/Xcode/DerivedData/* 2>/dev/null
fi
# 5. 清理 Homebrew 缓存
if command -v brew &> /dev/null; then
    echo "清理 Homebrew 缓存..."
    brew cleanup --prune=all 2>/dev/null
fi
echo "清理结束!"

跨平台通用方案(Python)

如果你需要在多个系统上运行同样的逻辑,Python 是一个好的选择。

#!/usr/bin/env python3
import os
import sys
import shutil
import tempfile
from pathlib import Path
def clean_temp_dirs(dirs, days_old=7):
    """清理指定目录下超过 N 天的文件"""
    import time
    now = time.time()
    limit = days_old * 86400  # 转换为秒
    for dir_path in dirs:
        if not Path(dir_path).exists():
            continue
        for root, dirs, files in os.walk(dir_path):
            for name in files:
                file_path = os.path.join(root, name)
                try:
                    file_age = now - os.path.getatime(file_path)
                    if file_age > limit:
                        os.remove(file_path)
                except Exception as e:
                    sys.stderr.write(f"跳过 {file_path}: {e}\n")
def main():
    # 根据操作系统选择路径
    if sys.platform == 'win32':
        temp_dirs = [
            os.environ.get('TEMP', ''),
            os.path.join(os.environ.get('WINDIR', 'C:\\Windows'), 'Temp'),
            os.path.join(os.environ.get('USERPROFILE', ''), 'AppData', 'Local', 'Temp')
        ]
    elif sys.platform == 'darwin':  # macOS
        temp_dirs = [
            '/tmp', '/var/tmp',
            os.path.expanduser('~/Library/Caches'),
            os.path.expanduser('~/Library/Logs')
        ]
    else:  # Linux
        temp_dirs = ['/tmp', '/var/tmp', os.path.expanduser('~/.cache')]
    # 过滤掉空路径
    temp_dirs = [d for d in temp_dirs if d]
    print(f"清理目录: {temp_dirs}")
    clean_temp_dirs(temp_dirs, days_old=7)
    print("清理完成!")
if __name__ == "__main__":
    main()

通用安全准则与注意事项

  1. 不要直接删除目录本身

    • 错误:rm -rf /tmp 会删除系统挂载点并导致程序崩溃。
    • 正确:只删除 /tmp 下的内容,如 rm -rf /tmp/*(但注意隐藏文件)。
  2. 处理被占用的文件

    • 文件正在被其他程序使用时无法删除,脚本应自动跳过(如 -ErrorAction SilentlyContinue / 2>/dev/null)。
  3. 考虑时间阈值

    • 不要删除正在使用的临时文件,建议只删除 7 天30 天 以上未访问的文件。
  4. 权限管理

    • 系统临时目录(C:\Windows\Temp/tmp/var/tmp)通常需要管理员或 root 权限,建议脚本检查权限或使用 sudo
  5. 测试先行

    • 建议先用 echo 模拟删除,或用 find-print 选项预览将删的文件。
      find /tmp -type f -atime +7 -print(查看文件列表,确认无误后再改为 -delete)。

自动化部署建议

  • Windows:将 PowerShell 脚本保存为 .ps1,通过 任务计划程序 设置定期执行(如每周日)。
  • Linux/macOS:将脚本保存为 .sh,使用 chmod +x 赋予可执行权限,通过 crontab 设置定时任务(如 0 3 * * 0 /path/to/cleanup.sh)。
  • 企业级:推荐使用配置管理工具(Ansible、Puppet、SCCM)统一分发和执行清理脚本。

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