You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带双过滤规则的旧数据清理CronJob:单规则失效求助

问题:CronJob删除旧目录时无法跳过.save结尾的目录

我需要创建一个CronJob,用于删除超过指定时间的旧目录及其内部所有内容,但必须跳过blist目录以及所有以.save结尾的目录。在Ubuntu 24.04上测试时,发现blist目录能正常保留,但.save目录仍会被删除。试过!/-not/-prune参数、调整-depth、修改规则顺序、替换-name为-path等操作,都没解决问题。

当前测试情况

测试阶段先针对超过1分钟的目录进行操作,使用的命令:

find test_dir/store/tmp/ -depth -type d \( ! -name "*.save" -o ! -path test_dir/store/tmp/blist \) -mmin +1 -exec rm -rf {} 2>/dev/null \;

单独查找.save目录的命令能正确定位目标:

usr@dev9:~$ find test_dir/store/tmp/ -type d \( -name "*.save" \) -mmin +1
test_dir/store/tmp/proj3/NX3.save

但执行删除命令时,包括.save目录在内的所有旧目录都会被删除,例如:

usr@dev9:~$ ls -l test_dir/store/tmp/proj3/
total 20
drwxrwxr-x 3 usr usr 4096 Nov 20 08:51 NX1
drwxrwxr-x 3 usr usr 4096 Nov 20 08:51 NX2
drwxrwxr-x 3 usr usr 4096 Nov 20 08:51 NX3
drwxrwxr-x 3 usr usr 4096 Nov 20 08:51 NX3.save
drwxrwxr-x 3 usr usr 4096 Nov 20 08:51 NX4
usr@dev9:~$ find test_dir/store/tmp/ -type d \( ! -name "*.save" \) -mmin +1  -exec rm -rf {} 2>/dev/null \;
usr@dev9:~$ ls -l test_dir/store/tmp/proj3/
ls: cannot access 'test_dir/store/tmp/proj3/': No such file or directory

目录结构

test_dir
└── store
    └── tmp
        ├── blist
        ├── proj1
        ├── proj2
        └── proj3
            ├── NX1
            │   └── bdata
            ├── NX2
            │   └── bdata
            ├── NX3
            │   └── bdata
            ├── NX3.save
            │   └── bdata
            └── NX4
                └── bdata

解决方案

核心问题是逻辑运算符使用错误,原命令中的! -name "*.save" -o ! -path ...是或逻辑,导致只要不满足其中一个条件就会被匹配,进而被删除。同时需要用-prune跳过目标目录,避免父目录被删除时连带删掉子目录中的.save目录。

正确命令

find test_dir/store/tmp/ -type d \( -name "*.save" -o -path "test_dir/store/tmp/blist" \) -prune -o -type d -mmin +1 -exec rm -rf {} 2>/dev/null \;

命令解释

  1. -type d \( -name "*.save" -o -path "test_dir/store/tmp/blist" \) -prune:匹配到.save结尾的目录或blist目录时,执行-prune跳过该目录(不处理也不递归进入其内部)
  2. -o:表示“否则”,处理未被跳过的目录
  3. -type d -mmin +1 -exec rm -rf {} 2>/dev/null \;:匹配超过1分钟的目录,执行删除操作(2>/dev/null用于忽略删除不存在目录的错误提示)

测试建议

执行删除前,可先将-exec rm -rf {} 2>/dev/null \;替换为-print,查看匹配的目录是否符合预期:

find test_dir/store/tmp/ -type d \( -name "*.save" -o -path "test_dir/store/tmp/blist" \) -prune -o -type d -mmin +1 -print

内容的提问来源于stack exchange,提问作者Bagels1b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:02:34