使用查找排除子目录


115

我有这样的目录结构

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

但它没有按预期工作。

拉维


3
这不是一个好建议,但是它会让您摆脱很多麻烦和麻烦的情况:用管道grep -v something排除您不想要的一切
Miquel 2012年

Answers:


206

这有效:

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在路径中包含任何内容
  • -not -path "*456/incoming*":请勿456/incoming在路径中包含任何内容

得到一个错误“发现:错误的选择-找不到:路径列表谓词列表”
拉维

@Ravi您在使用bash shell吗?我刚刚在我的终端上对此进行了测试,它对我有用。如果对脚本进行了修改,请尝试复制并粘贴解决方案。
sampson-chen 2012年

它可以工作,但是列出目录而不是这些目录中的文件。
拉维

1
-path匹配整个字符串,因此,如果您正在执行操作find .,则您的-path字符串必须为./path/to/directory/*
Heath Borders

1
仅供参考,FYI -not -path肯定会在此示例中工作,但find仍会迭代目录结构,并使用cpu循环迭代所有这些目录/文件。为了防止find迭代这些目录/文件(也许那里有数百万个文件),则需要使用-prune(但是该-prune选项很难使用)。
Trevor Boyd Smith,

9

仅出于文档目的:您可能不得不更深入地研究,因为有许多“搜索跳过”星座(就像我必须这样做)。事实证明,这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

5

-name仅匹配文件名,而不匹配整个路径。-path相反,您想对要修剪目录的部分使用def/incoming


2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

7
一些解释可能使它成为更好的答案。
克里斯·伦戈

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

1
注意:如果find ... -print0与后来的用户一起使用,此技巧将不起作用xargs -0
phs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.