【问题标题】:Exclude a sub-directory using find使用 find 排除子目录
【发布时间】:2012-11-07 18:27:46
【问题描述】:

我有这样的目录结构

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

Data 目录内的所有文件夹中都有一个传入子文件夹。我想从除 def/incoming 和 456/incoming 目录之外的所有文件夹和子文件夹中获取所有文件。 我尝试了以下命令

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

但它没有按预期工作。

拉维

【问题讨论】:

标签: bash unix


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这行得通:

    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 的内容

    【讨论】:

    • 收到错误“find: bad option -not find: path-list predicate-list”
    • @Ravi 你在使用 bash shell 吗?我刚刚在我的终端上测试了它,它对我有用。如果您对脚本进行了修改,请尝试复制并粘贴解决方案。
    • 它可以工作,但是,它列出的目录不是那些目录中的文件。
    • -path 匹配整个字符串,所以如果你在做find .,那么你的-path 字符串需要是./path/to/directory/*
    • 仅供参考 -not -path 肯定会在这个例子中工作,但 find 仍在迭代目录结构并使用 cpu 周期来迭代所有这些目录/文件。为了防止find 遍历这些目录/文件(那里可能有数百万个文件),那么您需要使用-prune(但是-prune 选项很难使用)。
    【解决方案3】:

    只是为了记录:您可能需要更深入地挖掘,因为有很多 search'n'skip 星座(就像我必须这样做的那样)。可能会证明prune 是你的朋友,而-not -path 不会做你所期望的。

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

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

    要链接到最初的问题,不包括 finally 像这样为我工作:

    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
    

    【讨论】:

      【解决方案4】:
      find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"
      

      【讨论】:

      • 一些解释可能会使这成为一个更好的答案。
      • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个适当的解释将通过展示为什么这是解决问题的好方法来大大提高其长期价值,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设
      • 注意:如果将find ... -print0 与后来的xargs -0 结合使用,则此技巧不起作用
      【解决方案5】:

      通过How to exclude a directory in find . command的以下回答:

      find . \( -name ".git" -o -name "node_modules" \) -prune -o -print
      

      【讨论】:

        【解决方案6】:

        这就是我排除所有.git 目录并将其传递给-exec 以在其中查找某些内容的操作

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-20
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2021-10-01
          • 2018-02-02
          • 1970-01-01
          相关资源
          最近更新 更多