如何编写Unix脚本实现群晖文件添加至共享文件夹满5天自动删除
群晖共享文件夹按文件加入时间自动过期删除方案
方案1:基于ctime的轻量方案(适合无后续元数据修改的场景)
Unix/Linux文件系统默认存储三类文件时间:
- mtime:文件内容最后修改时间,也就是你原脚本使用的参数,复制/移动旧文件到共享文件夹时该时间不会更新,因此不符合需求
- ctime:文件inode元数据最后变更时间,无论是复制新文件到共享文件夹、还是将其他位置的旧文件移动到共享文件夹,操作完成后ctime都会自动更新为操作时间,刚好匹配你需要的「文件加入共享文件夹时间」
- 限制:如果文件放入共享文件夹后,你还会对其执行重命名、修改权限/属主、移动路径等操作,ctime会被更新,可能导致删除时间计算不准,这种情况请使用方案2
对应执行命令:
find /volume2/CHECKS -type f -ctime +5 -delete
参数说明:-ctime +5 表示筛选inode元数据变更时间距今超过5天的文件。
方案2:基于扩展属性的精准方案(适合所有场景)
如果需要完全避免其他操作对加入时间的干扰,可以用文件扩展属性主动记录文件的加入时间,该属性不会被常规文件操作修改,计算更精准。
步骤1:新增加入时间标记定时任务
在群晖控制面板-任务计划中新增一个每日执行的自定义脚本,运行用户设为root,脚本内容如下:
find /volume2/CHECKS -type f -not -attr "user.add_time" -exec setfattr -n user.add_time -v $(date +%s) {} \;
作用:每日扫描共享文件夹,给所有未标记加入时间的文件写入当前Unix时间戳作为加入时间。
步骤2:新增过期删除定时任务
再新增一个每日执行的自定义脚本,运行用户设为root,脚本内容如下:
#!/bin/sh # 配置参数 TARGET_DIR="/volume2/CHECKS" # 过期时间设为5天,单位秒 EXPIRE_SEC=$((5 * 86400)) NOW=$(date +%s) find "$TARGET_DIR" -type f -exec sh -c ' for file do # 读取文件的加入时间属性 add_time=$(getfattr -n user.add_time --only-values "$file" 2>/dev/null) # 时间超过阈值则删除 if [ -n "$add_time" ] && [ $((NOW - add_time)) -gt $EXPIRE_SEC ]; then rm -f "$file" fi done ' sh {} +
注意事项
- 两种方案都建议先把
-delete或者rm -f "$file"替换成print,先测试筛选出来的文件符合预期后再改为实际删除逻辑,避免误删 - 群晖任务计划执行的脚本需要确保运行用户有对应共享文件夹的读写删除权限
内容的提问来源于stack exchange,提问作者Max Blaauw
相关产品推荐
相关产品推荐

