带双过滤规则的旧数据清理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 \;
命令解释
-type d \( -name "*.save" -o -path "test_dir/store/tmp/blist" \) -prune:匹配到.save结尾的目录或blist目录时,执行-prune跳过该目录(不处理也不递归进入其内部)-o:表示“否则”,处理未被跳过的目录-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
相关产品推荐
相关产品推荐

