简单生活
返回文章列表
1053 字6 分钟

给飞牛 OS 加上回收站自动清理的功能

NAS#飞牛OS/fnOS

首先,感谢飞牛 OS 让 NAS 系统变得简单易用。

飞牛 OS 1.0 正式版已经发布了,一直没有回收站自动清理的功能。如果一直想不起去删除回收站的文件,存储空间就浪费了。

记得群晖和 OpenMediaVault 都有这个功能,不过没关系,自己动手丰衣足食。

bash 脚本

命名为你想要的文件名,如 fn_recyclebin_cleaner.sh,记得设置可执行权限 chmod +x fn_recyclebin_cleaner.sh。

自动清理所有存储空间、所有用户的回收站内超过指定天数的文件。

#!/bin/bash
# 飞牛NAS回收站清理脚本
# 功能:清理回收站内超过设定天数的文件,并删除因此产生的所有空文件夹
DEFAULT_DAYS=30
TRASH_PATH_PATTERN="/vol*/*/.@#local/trash"
usage() {
echo "用法: $0 [选项]"
echo "选项:"
echo " -d, --days DAYS 设置要保留文件的天数(默认: ${DEFAULT_DAYS}天)"
echo " -t, --test 测试模式,只显示将要进行的操作,不实际执行"
echo " -h, --help 显示此帮助信息"
}
DAYS=$DEFAULT_DAYS
TEST_MODE=false
while [[ $# -gt 0 ]]; do
case $1 in
-d|--days)
DAYS="$2"
shift; shift
;;
-t|--test)
TEST_MODE=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "错误: 未知选项 $1"
usage
exit 1
;;
esac
done
if ! [[ $DAYS =~ ^[0-9]+$ ]] || [ $DAYS -lt 1 ]; then
echo "错误: 天数参数必须为正整数"
exit 1
fi
echo "$(date): 开始飞牛NAS回收站清理任务(增强版)"
echo "配置: 保留最近 ${DAYS} 天的文件,并删除所有空文件夹"
# 主要清理过程
for trash_path in $TRASH_PATH_PATTERN; do
if [ -d "$trash_path" ]; then
echo "正在处理回收站路径: $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): 回收站清理任务完成"

使用方法

测试模式

Terminal window
# 预览将删除的文件
sudo /data/scripts/fn_recyclebin_cleaner.sh --test --days 30
# 或者使用短选项
sudo /data/scripts/fn_recyclebin_cleaner.sh -t -d 30

实际使用

用参数 -d 指定日期

Terminal window
# 删除超过30天的文件(使用默认值)
sudo /data/scripts/fn_recyclebin_cleaner.sh
# 删除超过7天的文件
sudo /data/scripts/fn_recyclebin_cleaner.sh -d 7

添加定时任务

crontab -e

Terminal window
# 每天凌晨2点执行回收站清理,保留30天内的文件
0 2 * * * /data/scripts/fn_recyclebin_cleaner.sh -d 30

PS

宝塔面板的文件管理器也是只有回收站,没有自动清理的功能,简单修改 TRASH_PATH_PATTERN 的路径就可以套用了。

飞牛 OS 的新出的团队文件夹,回收站路径是 /vol*/@team/*/.@#local/trash,看来要增加一规则才能匹配了。

参考文档

飞牛能自动清空回收站吗? - 问答互助飞牛私有云论坛 fnOS