本文目录导读:

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
安全建议
- 先使用预览模式:首次使用时建议先使用预览模式确认会删除哪些文件
- 备份重要数据:在执行删除前建议备份重要文件
- 使用绝对路径:避免使用相对路径导致误删
- 权限检查:确保有足够的权限操作目标目录