当find在路径中间使用通配符时,删除目录



我需要删除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

最新更新