使用find排除子目录

Rav*_*avi 106 unix bash

我有这样的目录结构

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed
Run Code Online (Sandbox Code Playgroud)

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

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

但它没有按预期工作.

拉维

sam*_*hen 193

这有效:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"
Run Code Online (Sandbox Code Playgroud)

说明:

  • find /home/feeds/data:从指定路径开始递归查找
  • -type f:仅查找文件
  • -not -path "*def/incoming*":不要def/incoming在其路径中包含任何内容
  • -not -path "*456/incoming*":不要456/incoming在其路径中包含任何内容

  • 仅供参考,`-not -path` 在这个例子中肯定会起作用,但 `find` 仍在迭代目录结构并使用 cpu 周期来迭代所有这些目录/文件。为了防止 `find` 遍历这些目录/文件(那里可能有数百万个文件),那么你需要使用 `-prune`(但是 `-prune` 选项很难使用)。 (4认同)
  • `-path` 匹配整个字符串,所以如果你在做 `find .`,那么你的 `-path` 字符串需要是 `./path/to/directory/*` (3认同)

pet*_*oak 8

仅仅为了记录:你可能需要深入挖掘,因为有很多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 
Run Code Online (Sandbox Code Playgroud)

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

它可能还取决于您的查找版本.我知道了:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
Run Code Online (Sandbox Code Playgroud)


Bri*_*ell 5

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