1053 字6 分钟
给飞牛 OS 加上回收站自动清理的功能
首先,感谢飞牛 OS 让 NAS 系统变得简单易用。
飞牛 OS 1.0 正式版已经发布了,一直没有回收站自动清理的功能。如果一直想不起去删除回收站的文件,存储空间就浪费了。
记得群晖和 OpenMediaVault 都有这个功能,不过没关系,自己动手丰衣足食。
bash 脚本
命名为你想要的文件名,如 fn_recyclebin_cleaner.sh,记得设置可执行权限 chmod +x fn_recyclebin_cleaner.sh。
自动清理所有存储空间、所有用户的回收站内超过指定天数的文件。
#!/bin/bash
# 飞牛NAS回收站清理脚本
# 功能:清理回收站内超过设定天数的文件,并删除因此产生的所有空文件夹
DEFAULT_DAYS=30TRASH_PATH_PATTERN="/vol*/*/.@#local/trash"
usage() {echo "用法: $0 [选项]"echo "选项:"echo " -d, --days DAYS 设置要保留文件的天数(默认: ${DEFAULT_DAYS}天)"echo " -t, --test 测试模式,只显示将要进行的操作,不实际执行"echo " -h, --help 显示此帮助信息"}
DAYS=$DEFAULT_DAYSTEST_MODE=false
while [[ $# -gt 0 ]]; docase $1 in-d|--days)DAYS="$2"shift; shift;;-t|--test)TEST_MODE=trueshift;;-h|--help)usageexit 0;;*)echo "错误: 未知选项 $1"usageexit 1;;esacdone
if ! [[ $DAYS =~ ^[0-9]+$ ]] || [ $DAYS -lt 1 ]; then echo "错误: 天数参数必须为正整数" exit 1fi
echo "$(date): 开始飞牛NAS回收站清理任务(增强版)"echo "配置: 保留最近 ${DAYS} 天的文件,并删除所有空文件夹"
# 主要清理过程
for trash_path in $TRASH_PATH_PATTERN; doif [ -d "$trash_path" ]; thenecho "正在处理回收站路径: $trash_path"
if [ "$TEST_MODE" = true ]; then # 测试模式:显示找到的旧文件,不实际删除 echo "=== 测试模式 ===" echo "以下超过 ${DAYS} 天的文件将被删除:" find "$trash_path" -type f -mtime +$DAYS -exec ls -la {} \; file_count=$(find "$trash_path" -type f -mtime +$DAYS | wc -l) echo "找到 $file_count 个超过 ${DAYS} 天的文件(测试模式)"
# 查找并显示空文件夹(包括因删除文件而变空的文件夹) echo "以下空文件夹(包括即将因文件删除而变空的文件夹)将被删除:" find "$trash_path" -type d -empty -exec ls -ld {} \; dir_count=$(find "$trash_path" -type d -empty | wc -l) echo "找到 $dir_count 个空文件夹(测试模式)" else # 实际执行模式 # 1. 首先删除超过指定天数的文件 file_count=$(find "$trash_path" -type f -mtime +$DAYS | wc -l) if [ $file_count -eq 0 ]; then echo "未找到超过 ${DAYS} 天的文件" else echo "找到 $file_count 个超过 ${DAYS} 天的文件,开始删除..." find "$trash_path" -type f -mtime +$DAYS -exec rm -f {} \; echo "文件删除完成" fi
# 2. 然后删除所有空文件夹(包括因文件删除而产生的空文件夹) # 使用循环确保删除多级空目录 dir_count=$(find "$trash_path" -type d -empty | wc -l) if [ $dir_count -eq 0 ]; then echo "未找到空文件夹" else echo "找到 $dir_count 个空文件夹,开始删除..." # 使用while循环处理,因为删除父目录后可能会产生新的空目录 while [ $(find "$trash_path" -type d -empty | wc -l) -gt 0 ]; do find "$trash_path" -type d -empty -exec rmdir {} \; 2>/dev/null done echo "空文件夹清理完成" fi fi echo "----------------------------------------" fi
done
echo "$(date): 回收站清理任务完成"使用方法
测试模式
# 预览将删除的文件sudo /data/scripts/fn_recyclebin_cleaner.sh --test --days 30
# 或者使用短选项
sudo /data/scripts/fn_recyclebin_cleaner.sh -t -d 30实际使用
用参数 -d 指定日期
# 删除超过30天的文件(使用默认值)sudo /data/scripts/fn_recyclebin_cleaner.sh
# 删除超过7天的文件
sudo /data/scripts/fn_recyclebin_cleaner.sh -d 7添加定时任务
crontab -e
# 每天凌晨2点执行回收站清理,保留30天内的文件0 2 * * * /data/scripts/fn_recyclebin_cleaner.sh -d 30PS
宝塔面板的文件管理器也是只有回收站,没有自动清理的功能,简单修改 TRASH_PATH_PATTERN 的路径就可以套用了。
飞牛 OS 的新出的团队文件夹,回收站路径是 /vol*/@team/*/.@#local/trash,看来要增加一规则才能匹配了。