从查找和删除中排除隐藏目录

从查找和删除中排除隐藏目录

我正在研究一个清除逻辑,我需要删除超过 7 天的日志。

现在日志有两种类型:1)以 developer_ 开头;2)以 _c 结尾

我关心的日志仅位于/NAS/logs该路径中的任何其他子文件夹之后,而不是之后。

以下是日志样本:

/NAS/logs/.snapshot/Enterprise_Primary.2019-11-17_1300/developer_score_20191113.log
/NAS/logs/.snapshot/Enterprise_Primary.2019-11-17_1300/trdcvf_03_00_c.log.20191113163858
/NAS/logs/trddffgc004_00_c.log.20191118030038
/NAS/logs/developer_run_score.log.20191118030039

在这里,我想排除隐藏文件夹 .snapshot 中的所有日志,因为我无权访问这些日志。

我试图使用下面的命令来识别它们,但它也不断给我提供 .snapshot 文件。

我也尝试过 -prune 选项但没有帮助。

  find /NAS/logs/  -mindepth 1 -type f  \( -iname "*_c.log.*" -or -iname "developer_run_*"  \) -not -path "./.snapshot/*"

最终命令

find /NAS/logs/  -mindepth 1 -type f  \( -iname "*_c.log.*" -or -iname "developer_run_*"  \) -not -path "./.snapshot/*"-mtime +7 -delete

谁能帮我从查找中排除该目录?

答案1

您的示例文件均不满足您指定的第二个文件名标准。有些文件包含_c但没有一个以_c.假设你的意思是包含你可以find像这样构建命令:

find /NAS/logs -type d -path '/NAS/logs/.snapshot' -prune -o -type f -mtime +7 \( -name 'developer_*' -o -name '*_c*' \) -print

这可以分为两部分(-o(或)条件):

  1. 树路径匹配/NAS/logs/.snapshot被丢弃(修剪)并且不考虑进一步的操作。
  2. 列出(打印)超过 7 天前修改且名称与 或 匹配的文件developer_**_c*

您应该替换-print-delete,或者简单地附加-delete以删除您匹配的文件。

如果您想修剪目录的任何实例,.snapshot您可以修改匹配条件的第一部分,如下所示

find /NAS/logs -type d -name '.snapshot' -prune -o ...

现在您已经向问题添加了额外的信息,实际上不再需要任何修剪复杂性。你可以使用这个:

find /NAS/logs -maxdepth 1 -type f -mtime +7 \( -name 'developer_*' -o -name '*_c*' \) -print

(这表明在问题中提供完整信息的重要性,而不是零散地提供信息 - 或者根本不提供。)

答案2

我也尝试过 -prune 选项但没有帮助

发生什么了?

我的评论中的链接显示,由于 -深度, -prune 和 -delete 一起使用存在问题。查找和修剪解释

我认为在这里你必须做类似的事情

... -path '*/.snapshot/*' -o ... ... -delete

只有使用大量数据(和测试),您才会错过“-prune”操作。


find kernel -path '*/sched/*' -o -name '???.c' -exec grep -H 'struct ta' {} +

在 sys.c、pid.c 和 cpu.c 中查找行。

没有 的相同-o(与 相同-a)仅在 kernel/sched/psi.c 中给出三行。

相关内容