我希望使用以下方法查找 '/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
跳过括号内匹配的所有目录。