使用find排除子目录

我有这样的目录结构

data |___ | abc |____incoming def |____incoming |____processed 123 |___incoming 456 |___incoming |___processed 

Data目录中的所有文件夹中都有一个传入的子文件夹。 我想从所有的文件夹和子文件夹除def / incoming和456 /传入的目录的所有文件。 我试着用下面的命令

  find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print 

但并不像预期的那样工作。

拉维

这工作:

 find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*" 

说明:

  • find /home/feeds/data :从指定的path开始recursion查找
  • -type f :仅查找文件
  • -not -path "*def/incoming*" :不要包含任何def/incoming作为path的一部分
  • -not -path "*456/incoming*" :不要包含456/incoming任何内容作为其path的一部分

-name只匹配文件名,而不是整个path。 你想要使用-path而不是像def/incoming那样修剪目录的部分。

只是为了文档:你可能需要深入挖掘,因为有很多search'n'skip星座(就像我不得不)。 可能会发现, prune是你的朋友,而不是-not -path不会做你期望的。

所以这是15个查找示例排除目录的有价值的例子:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

要链接到最初的问题,排除终于为我这样工作:

 find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

然后,如果你想find一个文件,仍然排除pathes,只需添加| grep myFile.txt | grep myFile.txt

它也可能取决于你的查找版本。 我懂了:

 $ find -version GNU find version 4.2.27 Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX