我需要删除cron执行的清理例程中的目录(及其内容)。我不确定我是否正确地处理了这个问题。为了测试什么会被删除,我用echo代替了running和rm-rf。问题可能是我的通配符位于路径的中间。。。。??
#!/bin/bash
dirsPATH="/images/*/03_processed"
find $dirsPATH -type d -mtime +2 -maxdepth 2 -exec echo {} ;
或
for i in $(find $dirsPATH -type d -mtime +2)
do
echo $i
done
我不想删除"03_processed"目录,我想删除这些目录的内容——但是,当我运行其中任何一个时,输出包括/images/xxxx/03_proccessed
/images/aaaa/03_processed
/images/aaaa/03_processed/761010184884
/images/aaaa/03_processed/79171833116
/images/aaaa/03_processed/873705734964
/images/aaaa/03_processed/997297772672
/images/bbbb/03_processed
/images/bbbb/03_processed
我尝试过在变量定义中使用尾随的"/",也尝试过在命令中使用"$dirsPATH/"。。。
任何想法都将不胜感激-感谢
如果您的目标是删除目录的内容,那么使用echo
进行测试是一个非常好的主意。
但是,您的第一个示例使用find
命令,该命令必然包含这些目录。
一种解决方案可能是使用-mindepth
,正如hek2mgl所建议的那样。另一种可能只是使用bash自己的路径名扩展。
echo /images/*/03_processed/*/
如果此列表与您认为应该删除的内容相匹配(尽管有-mtime
),请将其用于find
:
find /images/*/03_processed/*/ -mtime +2 -maxdepth 0 -type d -ls
当然,当你准备好了,用-exec rm -rfv {} ;
或类似的东西替换-ls
。
注意在所有这些情况下,-mtime +2
限制适用于目录,而不是其内容。可以在这些目录中更新文件,或者在包含的目录中创建文件或目录,而不会影响父目录上上次修改的时间。为了证明这一点:
$ mkdir foo; stat foo | grep ^Mod
Modify: 2016-01-12 11:58:37.219228265 -0500
$ sleep 5; mkdir foo/bar; stat foo | grep ^Mod
Modify: 2016-01-12 11:58:42.581329442 -0500
$ sleep 5; mkdir foo/bar/baz; stat foo | grep ^Mod
Modify: 2016-01-12 11:58:42.581329442 -0500
$
请注意,最终目录创建(baz
)不会影响foo
的修改时间。
使用find
:的-mindepth
选项
find $dirsPATH -mindepth 1 -maxdepth 2 -type d -mtime +2 -exec echo {} ;
顺便说一句,如果在实际使用-exec
选项之前只测试会找到哪些文件,那么只需省略它。打印文件名是默认行为:
find $dirsPATH -mindepth 1 -maxdepth 2 -type d -mtime +2