使用 find 排除子目录



>我有这样的目录结构

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

数据目录中的所有文件夹中都有一个传入的子文件夹。我想从所有文件夹和子文件夹中获取除 def/传入和 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:开始从指定路径递归查找
  • -type f:仅查找文件
  • -not -path "*def/incoming*":不要包含任何带有def/incoming的内容作为其路径的一部分
  • -not -path "*456/incoming*":不要包含任何带有456/incoming作为其路径的一部分的内容

只是为了文档:您可能需要更深入地挖掘,因为有许多搜索'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

-name只匹配文件名,而不是整个路径。您希望改用-path,用于要修剪目录的部分,例如 def/incoming .

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

通过以下答案 如何在查找中排除目录 . 命令:

find . ( -name ".git" -o -name "node_modules" ) -prune -o -print
这就是

我所做的排除所有.git目录并将其传递给-exec以在

find . -not -path '*/.*' -type f -exec grep "pattern" [] ;
  • -not -path '*/.*'将排除所有隐藏目录
  • -type f只会列出类型文件,然后您可以将其传递给-exec或任何您想要做的事情

相关内容

  • 没有找到相关文章

最新更新