批量删除指定日期前文件脚本

wen 实用脚本 1

本文目录导读:

批量删除指定日期前文件脚本

  1. Bash版本(Linux/macOS)
  2. 增强版Bash脚本(带文件匹配模式和预览功能)
  3. PowerShell版本(Windows)
  4. 使用方法
  5. 安全建议

Bash版本(Linux/macOS)

#!/bin/bash
# 批量删除指定日期前的文件
# 用法: ./delete_old_files.sh /path/to/directory "2024-01-01"
# 检查参数
if [ $# -ne 2 ]; then
    echo "用法: $0 <目录路径> <日期(YYYY-MM-DD)>"
    echo "示例: $0 /home/user/logs 2024-01-01"
    exit 1
fi
TARGET_DIR="$1"
CUTOFF_DATE="$2"
# 检查目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
    echo "错误: 目录 '$TARGET_DIR' 不存在"
    exit 1
fi
# 检查日期格式
if ! date -d "$CUTOFF_DATE" > /dev/null 2>&1; then
    echo "错误: 日期格式无效,请使用 YYYY-MM-DD 格式"
    exit 1
fi
echo "开始处理目录: $TARGET_DIR"
echo "删除 $CUTOFF_DATE 之前的文件"
# 计算秒数差,用于比较
CUTOFF_SECONDS=$(date -d "$CUTOFF_DATE" +%s)
# 遍历文件并删除
find "$TARGET_DIR" -type f | while read -r file; do
    # 获取文件的修改时间(秒数)
    FILE_TIME=$(stat -c "%Y" "$file")
    if [ "$FILE_TIME" -lt "$CUTOFF_SECONDS" ]; then
        echo "删除: $file (修改时间: $(date -d @$FILE_TIME '+%Y-%m-%d %H:%M:%S'))"
        rm "$file"
    fi
done
echo "完成! 已删除指定日期前的文件"

增强版Bash脚本(带文件匹配模式和预览功能)

#!/bin/bash
# 批量删除指定日期前的文件(增强版)
# 功能: 支持文件模式匹配,预览模式,递归处理
show_help() {
    echo "用法: $0 [选项] <目录路径> <日期(YYYY-MM-DD)>"
    echo "选项:"
    echo "  -p, --pattern PATTERN  文件匹配模式 (默认: *)"
    echo "  -d, --dry-run         预览模式,不实际删除"
    echo "  -r, --recursive       递归处理子目录 (默认: 是)"
    echo "  -v, --verbose         显示详细信息"
    echo "  -h, --help            显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 /home/user/logs 2024-01-01"
    echo "  $0 -p \"*.log\" /var/log 2024-06-01"
    echo "  $0 -d -p \"*.tmp\" /tmp 2024-01-01"
}
# 默认参数
PATTERN="*"
DRY_RUN=false
RECURSIVE=true
VERBOSE=true
# 解析参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -p|--pattern)
            PATTERN="$2"
            shift 2
            ;;
        -d|--dry-run)
            DRY_RUN=true
            shift
            ;;
        -r|--recursive)
            RECURSIVE=true
            shift
            ;;
        -v|--verbose)
            VERBOSE=true
            shift
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            break
            ;;
    esac
done
# 检查参数数量
if [ $# -ne 2 ]; then
    show_help
    exit 1
fi
TARGET_DIR="$1"
CUTOFF_DATE="$2"
# 检查目录
if [ ! -d "$TARGET_DIR" ]; then
    echo "错误: 目录 '$TARGET_DIR' 不存在"
    exit 1
fi
# 验证日期
if ! date -d "$CUTOFF_DATE" > /dev/null 2>&1; then
    echo "错误: 无效的日期格式,请使用 YYYY-MM-DD"
    exit 1
fi
CUTOFF_SECONDS=$(date -d "$CUTOFF_DATE" +%s)
DELETED_COUNT=0
echo "目标目录: $TARGET_DIR"
echo "截止日期: $CUTOFF_DATE"
echo "文件模式: $PATTERN"
echo "递归处理: $([ "$RECURSIVE" = true ] && echo "是" || echo "否")"
echo "预览模式: $([ "$DRY_RUN" = true ] && echo "是" || echo "否")"
echo ""
# 构建find命令
FIND_CMD="find \"$TARGET_DIR\" -type f -name \"$PATTERN\""
if [ "$RECURSIVE" = false ]; then
    FIND_CMD="$FIND_CMD -maxdepth 1"
fi
# 遍历并处理文件
eval "$FIND_CMD" | while read -r file; do
    FILE_TIME=$(stat -c "%Y" "$file")
    if [ "$FILE_TIME" -lt "$CUTOFF_SECONDS" ]; then
        FILE_DATE=$(date -d @$FILE_TIME '+%Y-%m-%d %H:%M:%S')
        if [ "$DRY_RUN" = true ]; then
            [ "$VERBOSE" = true ] && echo "[预览] 将删除: $file ($FILE_DATE)"
        else
            [ "$VERBOSE" = true ] && echo "删除: $file ($FILE_DATE)"
            if rm "$file" 2>/dev/null; then
                ((DELETED_COUNT++))
            else
                echo "错误: 无法删除 $file" >&2
            fi
        fi
    fi
done
if [ "$DRY_RUN" = true ]; then
    echo ""
    echo "预览完成,未实际删除文件"
else
    echo ""
    echo "完成! 已删除 $DELETED_COUNT 个文件"
fi

PowerShell版本(Windows)

<#
.SYNOPSIS
    批量删除指定日期前的文件
.DESCRIPTION
    删除指定目录中创建时间早于指定日期的文件
.PARAMETER Path
    要处理的目录路径
.PARAMETER Date
    截止日期 (格式: yyyy-MM-dd)
.PARAMETER Pattern
    文件匹配模式 (默认: *.*)
.PARAMETER Recurse
    是否递归处理子目录
.PARAMETER WhatIf
    预览模式,不实际删除
.EXAMPLE
    .\Delete-OldFiles.ps1 -Path "C:\Logs" -Date "2024-01-01"
    .\Delete-OldFiles.ps1 -Path "C:\Temp" -Date "2024-06-01" -Pattern "*.tmp" -WhatIf
#>
param(
    [Parameter(Mandatory=$true)]
    [string]$Path,
    [Parameter(Mandatory=$true)]
    [datetime]$Date,
    [string]$Pattern = "*.*",
    [switch]$Recurse = $true,
    [switch]$WhatIf
)
# 检查路径
if (-not (Test-Path $Path)) {
    Write-Error "路径 '$Path' 不存在"
    exit 1
}
# 检查日期
if ($Date -gt (Get-Date)) {
    Write-Warning "指定日期在未来,没有文件可以被删除"
    exit 0
}
Write-Host "目标目录: $Path"
Write-Host "截止日期: $($Date.ToString('yyyy-MM-dd'))"
Write-Host "文件模式: $Pattern"
Write-Host "递归处理: $Recurse"
Write-Host "预览模式: $WhatIf"
Write-Host ""
# 获取文件列表
$files = Get-ChildItem -Path $Path -Filter $Pattern -File -Recurse:$Recurse
$deletedCount = 0
$totalSize = 0
foreach ($file in $files) {
    # 检查文件的最后写入时间
    if ($file.LastWriteTime -lt $Date) {
        if ($WhatIf) {
            Write-Host "[预览] 将删除: $($file.FullName) (修改时间: $($file.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss')))"
        } else {
            try {
                $size = $file.Length
                Remove-Item -Path $file.FullName -Force -ErrorAction Stop
                Write-Host "删除: $($file.FullName) (修改时间: $($file.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss')))"
                $deletedCount++
                $totalSize += $size
            } catch {
                Write-Error "无法删除 '$($file.FullName)': $_"
            }
        }
    }
}
if ($WhatIf) {
    Write-Host "`n预览完成,未实际删除文件"
} else {
    $sizeFormatted = if ($totalSize -gt 1GB) {
        "{0:N2} GB" -f ($totalSize / 1GB)
    } elseif ($totalSize -gt 1MB) {
        "{0:N2} MB" -f ($totalSize / 1MB)
    } else {
        "{0:N2} KB" -f ($totalSize / 1KB)
    }
    Write-Host "`n完成! 已删除 $deletedCount 个文件,释放空间: $sizeFormatted"
}

使用方法

Bash脚本

# 赋予执行权限
chmod +x delete_old_files.sh
# 基本用法
./delete_old_files.sh /path/to/directory 2024-01-01
# 增强版用法(预览模式)
./delete_old_files.sh -d -p "*.log" /var/log 2024-06-01
# 只删除当前目录
./delete_old_files.sh -r false /tmp 2024-01-01

PowerShell脚本

# 基本用法
.\Delete-OldFiles.ps1 -Path "C:\Logs" -Date "2024-01-01"
# 预览模式
.\Delete-OldFiles.ps1 -Path "C:\Temp" -Date "2024-06-01" -Pattern "*.tmp" -WhatIf
# 不递归子目录
.\Delete-OldFiles.ps1 -Path "C:\Data" -Date "2024-01-01" -Recurse:$false

安全建议

  1. 先使用预览模式:首次使用时建议先使用预览模式确认会删除哪些文件
  2. 备份重要数据:在执行删除前建议备份重要文件
  3. 使用绝对路径:避免使用相对路径导致误删
  4. 权限检查:确保有足够的权限操作目标目录

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