130

我有这样的目录结构

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

但它没有按预期工作。

拉维

4

6 回答 6

228

这有效:

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在其路径中包含任何内容
于 2012-11-19T19:22:27.833 回答
12

只是为了记录:您可能需要更深入地挖掘,因为有很多 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
于 2014-08-04T07:15:53.880 回答
5

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

于 2012-11-19T19:16:29.110 回答
2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"
于 2018-01-17T22:12:58.963 回答
1

通过以下关于如何在 find 中排除目录的答案。命令

find . \( -name ".git" -o -name "node_modules" \) -prune -o -print
于 2020-04-08T11:45:31.163 回答
0

这就是我为排除所有.git目录并将其传递给-exec

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