如何使“查找”排除搜索到的文件夹?


18

我正在运行以下命令:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

我想删除该文件夹下的所有文件processing夹(永远不要删除处理文件夹)。

该命令也将删除该processing文件夹。如何限制脚本删除该文件夹下的文件夹?


Answers:


32

最简单的方法是只添加-mindepth 1,这将跳过第一个深度层次结构,从而省去了父目录。

此外,您无需额外-exec致电rm,如果文件夹为空,则可以直接delete将其直接保存

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

如果它们不为空:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

如果您很懒,也可以扩展通配符。由于*默认情况下不包含当前目录(除非dotglob设置了),所以您还可以执行以下操作:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

但是,同样由于该dotglob选项,它也将不包括隐藏文件夹。


嗨,我得到“发现:警告:您已经在非选项参数-type之后指定了-mindepth选项,但是选项不是位置性的(-mindepth影响在其之前和之后指定的测试。)请指定选项以及其他“找到:无法删除`/ folder / 50d82faf0e09e':目录不为空”
Elad Dotan

在输入之前添加mindepth。要在不为空时删除目录,可以坚持使用原来的rm方法。
slhck

4

问题是find会返回当前目录(。)以及其他目录,因此它会删除处理文件夹以及子目录。解决该问题的一种快速方法是添加选项

-not -name .

这会停止查找从当前目录的输出,并阻止其被删除。

如果您正在处理目录中运行命令,那将起作用,因此要考虑到您使用的是绝对路径:

-not -name /var/www/html/content/processing

整个命令将是:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

最后一条命令是错误的。-name指的是基本名称,它永远不会与任何带有斜杠的内容匹配。您可能需要使用-path
卡米尔Maciorowski

1

已经回答,我仍然想列举另一种方法。

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

这将排除顶层目录(以及子目录),现在您可以在该目录上应用我们要应用的任何命令。

>>选项:
-mindepth 1:排除根目录
-maxdepth 1:避免解析子目录。(对于有疑问的特定情况,您不需要此)。
-type d:仅列出目录类型。此选项应在使用mindepth,maxdepth之后使用。


为什么-maxdepth 1呢 为什么-type d两次?这与接受的答案有何不同?
Attie

@Attie:谢谢,纠正了这个错误。maxdepth不是必需的,但是如果要避免列出子目录,它将很有用。
令人沮丧的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.