如何从查找搜索中排除与通配符匹配的多个文件夹

如何从查找搜索中排除与通配符匹配的多个文件夹

我希望使用以下方法查找 '/app/test' 目录下除以 'tmp' 和 'logs' 开头的文件夹之外的所有文件和文件夹prune

因此我尝试了以下命令。

find /app/test -type d \( ! -name logs* \)  -o \( ! -name log \)  -o \( ! -name tmp* \)  -o
\( ! -name tmp \) -prune | tee /tmp/findall.log

但我看到查找结果中包含顶级文件夹,如下所示:

/app/test/Admin/tmp/data/pm.trp
/app/test/Admin/tmp/wond/iqc.log
etc ...

你能建议一下吗?

答案1

除了不引用包含文件名通配符的单词之外,您还颠倒了所有测试的含义-name,从而修剪了包含文件名通配符的名称不是匹配搜索树中的这些名称和模式。

反而:

find /app/test -type d \
    \( -name 'logs*' -o -name log -o -name 'tmp*' -o -name tmp \) -prune -o \
    -print | tee /tmp/findall.log

-prune如果没有 ,测试仍然会打印-print出与该点匹配的事物的路径名。

答案2

另一种方法:

find /app/test -type d \( -path "*/log*" -o -path "*/tmp" \) -prune -o -print | tee /tmp/findall.log

注意,使用时-path要匹配完整的目录名;因此*在 glob 模式中使用前面的通配符。

另请注意,"*/tmp"仅匹配名称为 的目录的路径tmp,而不匹配名为tmp2或 的目录tmporary; while"*/log*"将匹配任何路径,包括以 . 开头的目录名log

-prune使find跳过括号内匹配的所有目录。

相关内容