CentOS 回收站性能优化指南
一 基线方案与工具选型
二 存储与清理策略
三 脚本化回收站与别名的安全做法
四 性能优化要点清单
五 示例脚本与定时任务
#!/usr/bin/env bash
set -Eeuo pipefail
TRASH_ROOT="${TRASH_ROOT:-$HOME/.local/share/Trash}"
FILES_DIR="$TRASH_ROOT/files"
INFO_DIR="$TRASH_ROOT/info"
MAX_AGE_DAYS="${MAX_AGE_DAYS:-7}"
MAX_SIZE_MB="${MAX_SIZE_MB:-10240}" # 10GB
cleanup() {
local now ts keep_before
now=$(date +%s)
keep_before=$((now - MAX_AGE_DAYS * 86400))
# 1) 按时间删除过期文件
find "$FILES_DIR" -mindepth 1 -maxdepth 1 -mtime +"$MAX_AGE_DAYS" -print0 | while IFS= read -r -d '' f; do
rm -rf -- "$f"
[ -e "$INFO_DIR/$(basename "$f").trashinfo" ] && rm -f -- "$INFO_DIR/$(basename "$f").trashinfo"
done
# 2) 按容量上限清理最旧文件
local size_mb
size_mb=$(du -sm "$FILES_DIR" 2>/dev/null | awk '{print $1}')
if [ -n "$size_mb" ] && [ "$size_mb" -gt "$MAX_SIZE_MB" ]; then
find "$FILES_DIR" -mindepth 1 -maxdepth 1 -printf '%T@ %p\0' | sort -z -n \
| while IFS= read -r -d '' line; do
ts=${line%% *}
f=${line#* }
rm -rf -- "$f"
[ -e "$INFO_DIR/$(basename "$f").trashinfo" ] && rm -f -- "$INFO_DIR/$(basename "$f").trashinfo"
size_mb=$(du -sm "$FILES_DIR" 2>/dev/null | awk '{print $1}')
[ "$size_mb" -le "$MAX_SIZE_MB" ] && break
done
fi
}
# 避免并发执行
LOCK="$TRASH_ROOT/cleanup.lock"
exec 200>"$LOCK"
flock -n 200 || { echo "Another cleanup is running." >&2; exit 1; }
trap 'rm -f "$LOCK"' EXIT
cleanup
0 2 * * * /usr/local/bin/trash-clean >>/var/log/trash-cleanup.log 2>&1