我需要在cron执行的清理例程中删除目录(及其内容)。我不确定我是否正确接近这个。为了测试看什么会被删除,我替换了echo而不是运行和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_processed
/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 /”......
任何想法都将不胜感激 - 谢谢
答案 0 :(得分:2)
如果你的目标是删除目录的内容,那么使用echo
进行测试是一个非常好的主意。
然而,您的第一个示例使用find
命令,这些命令必然包含这些目录。
一种解决方案可能是使用-mindepth
,正如hek2mgl建议的那样。另一个可能只是使用bash自己的路径名扩展。
echo /images/*/03_processed/*/
如果此列表符合您认为应删除的内容(尽管-mtime
),请将其用于find
:
find /images/*/03_processed/*/ -mtime +2 -maxdepth 0 -type d -ls
当然,当您准备好后,请将-ls
替换为-exec rm -rfv {} \;
等。
注意 -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
的修改时间。
答案 1 :(得分:1)
使用-mindepth
的{{1}}选项:
find
顺便说一句,如果您只是在实际使用find $dirsPATH -mindepth 1 -maxdepth 2 -type d -mtime +2 -exec echo {} \;
选项之前测试将找到哪些文件,只需省略它即可。打印文件名是默认行为:
-exec