我有一个包含 6 个子目录的目录,但我只想删除其中 3 个子目录,因此我在这 3 个目录中使用了 for 循环来“cd”,但我想删除深度为 2 的子目录(最大深度、最小深度为 2) 3个子目录内。我在 base 使用 find 命令(base 是 3 个子目录之一),但它会从深度 1 找到目录(这是预期的)
我的文件结构是
/a/b/c/d/e
(a是我正在迭代的3个目录之一)
下面是我需要帮助/指导的代码的一部分 -
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30
这将输出 -
./b/c
所以我这样做不是希望删除目录/b
并仅删除目录c
和下面/内部深度
有没有办法做到这一点,或者我必须 cd 到该b
目录?
答案1
您可以修改命令以rm -rf
在找到的目录上执行 a,但您应该非常小心因为它可能导致数据丢失。操作方法如下:
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec rm -rf {} \;
与往常一样,您应该首先测试该命令echo
:
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec echo "Deleting: {}" \;
这将打印要删除的目录,允许您在实际删除任何内容之前验证命令的行为。
编辑:您正在寻找类似的东西吗?下面的命令不是破坏性的。
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec sh -c 'cd "{}" && echo "Deleting contents of $(pwd)"' \;
这个命令具有破坏性!
find /a -mindepth 2 -maxdepth 2 -type d -mtime +30 -exec sh -c 'cd "{}" && rm -rf *' \;
答案2
免责声明:我是 rawhide (rh) 的当前作者(请参阅https://github.com/raforg/rawhide)
您好,使用 rawhide (rh),您可以执行以下操作:
rh -m2 -M2 -x 'rm -r %s' /a 'd && old(30*days)'
首先要检查:
rh -m2 -M2 -x 'echo rm -r %s' /a 'd && old(30*days)'
-m2
是相同的-mindepth 2
。
-M2
是相同的-maxdepth 2
。
-x ...
在每次匹配时执行给定的 shell 命令。
%s
被匹配的文件路径替换(如 find 的{}
)。
/a
是一个搜索路径。
'd && old(30*days)'
匹配至少 30 天(或)d
内未修改(添加或删除条目)的目录( )。old(30*days)
old(month)
注意:检查mtime
目录的 只考虑每个目录自己的mtime
,而不考虑mtime
其任何内容的 。也是如此find
。
答案3
感谢大家提供有用的意见,我能够在我的个人计算机上复制我的问题/问题。
我能够使用以下命令解决我的问题 -
一些代码...
base2=$(pwd)
即,/a
find $base2 -mindepth 2 -maxdepth 2 -type d -mtime +30 | xargs rm -R
这将输出/a/b/c
,但是按照指定,它将仅删除深度为 2 的目录,即/c
命令运行后,我们将/a/b
按照我的要求进行操作。