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

时间:2016-01-12 16:18:05

标签: bash wildcard

我需要在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 /”......

任何想法都将不胜感激 - 谢谢

2 个答案:

答案 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