2012-11-19 100 views
68

我有这样排除使用子目录中找到

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

目录结构有一个在所有数据目录中的文件夹的话子文件夹中。我想从除了def/incoming和456/incoming dirs之外的所有文件夹和子文件夹中获取所有文件。 我尝试了用下面的命令

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

但预计它无法正常工作。

拉维

+1

这不是很好的建议,但它会让你出了很多的情况下,快速和肮脏的:管,要'的grep -v something'排除不管它是你不” t想 – Miquel

回答

126

这工作:

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

说明:

  • find /home/feeds/data:开始从指定的路径递归发现
  • -type f:发现只有
  • -not -path "*def/incoming*"文件:不包含任何与def/incoming作为我的一部分TS路径
  • -not -path "*456/incoming*":不包括与456/incoming什么作为其路径的一部分
+0

得到一个错误“找到:坏选项-not 找到:路径列表谓词列表” – Ravi

+0

@Ravi你使用bash shell吗?我只是在我的终端上测试了它,它对我很有用。如果您对脚本进行了修改,请尝试复制并粘贴解决方案。 –

+0

它的工作,但是,它列出的dirs不在这些dirs中的文件。 – Ravi

4

-name只匹配文件名,而不是整个路径。您想使用-path代替您修剪目录的部分,如def/incoming

4

只是为了文档的目的:可能因为有许多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 

然后,如果您希望查找一个文件并仍排除路径,只需添加| grep myFile.txt即可。

它也可能取决于您的查找版本。我看到:

$ find -version 
GNU find version 4.2.27 
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 
0
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/" 
+2

一些解释可能会使它变成好得多的答案。 –

+0

感谢您使用此代码段,这可能会提供一些有限的短期帮助。正确的解释将通过说明为什么这是解决问题的良好方法来大大提高其长期价值,并且会使未来的读者对其他类似问题更有用。请编辑您的答案以添加一些解释,包括您所做的假设 –