目前,我正在做完整的手工工作。
find /home/bash_cookbook/bash_cookbook/glassfish/domains/blog/logs -mtime +7 -type f -name 'application.log_*' -exec rm {} \;
仅输入我要遍历的所有目录名称就花了我 1 个小时。
问题?
有100多台服务器,每台服务器中有20个不同的域,每个域都有不同的域名称。我想到的一个聪明的方法是排除某些目录而不是包含所有目录。因为其中一些包含一些域,例如我不需要触及的“备份”。
但我不知道如何实现它。
我能想到的另一个巧妙的技巧是这个。
find /home/bash_cookbook/bash_cookbook/glassfish/domains/$domains_except_excluded_domains/logs -mtime +7 -type f -name 'application.log_*' -exec rm {} \;
为此,我需要domains_ except_excluded_domains 变量,该变量需要包含我想要排除的所有域。如何才能实现这一目标?
如果您正在使用
bash
或其他支持数组的 shell,您可以列出要包含的域集以进行处理:我猜测变量
$domain
应该插入到find
路径中的位置。根据需要移动它。如果您确定能够安全地枚举域,则可以使用类似的方法来排除域。此方法从要排除的域列表开始,将它们转换为关联数组(哈希)以进行快速查找,然后遍历域目录集,跳过哈希中的任何目录:
在这两种情况下,我强烈建议您替换
-delete
为-print
,直到您确定代码按预期工作。如果您的实现find
没有-delete
考虑使用-exec rm -f {} +
(请注意+
最后)要排除整个目录,一个选项是负匹配路径:
与 相比
-name
,-path
可以包含斜杠并且不会特殊对待斜杠。如果您的主要问题是速度,原因可能不是搜索目录太多,而是每个文件
-exec rm {}\;
调用rm
一次。只需将其替换为-delete
. 另请阅读有关和 之间man find
的区别 ,其中后者将使用尽可能多的结果作为命令参数列表。-exec command {}\;
-exec command {} +
这是我对这个问题的尝试。
脚本
它能做什么
更新: