使用 find 排除子目录

我有这样的目录结构

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

Data 目录中的所有文件夹中都有一个传入子文件夹。我想从所有的文件夹和子文件夹中获得所有的文件,除了 def/传入和456/传入的目录。 我按照命令进行了试验

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

但它并没有像预期的那样起作用。

拉维

105645 次浏览

-name只匹配文件名,不匹配整个路径。您希望改为使用 -path,用于剪裁目录(如 def/incoming)所在的部分。

这种方法是有效的:

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

说明:

  • 从指定的路径开始递归查找
  • 仅查找文件
  • -not -path "*def/incoming*": 不包括任何与 def/incoming作为其路径的一部分
  • -not -path "*456/incoming*": 不包括任何与 456/incoming作为其路径的一部分
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

如何在 find. command 中排除目录的答案如下:

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或您想要做的任何事情