unix 使用find排除子目录

yk9xbfzb  于 2023-08-04  发布在  Unix
关注(0)|答案(6)|浏览(177)

我有这样的目录结构

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


但它并不像预期的那样工作。
拉维

q3aa0525

q3aa05251#

这个方法的作用是:

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作为其路径的一部分
z6psavjg

z6psavjg2#

只是为了记录:你可能需要深入挖掘,因为有许多搜索'n'跳过星座(就像我不得不)。可能会发现prune是你的朋友,而-not -path不会做你期望的事情。
所以这是一个有价值的例子,包括15个排除目录的find示例:
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

svdrlsy4

svdrlsy43#

-name只匹配文件名,而不是整个路径。您希望使用-path来代替您正在修剪目录的部分,如def/incoming

j7dteeu8

j7dteeu84#

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

字符串

b5lpy0ml

b5lpy0ml5#

以下是How to exclude a directory in find . command的答案:

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

字符串

lztngnrs

lztngnrs6#

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

find . -not -path '*/\.*' -type f -exec grep "pattern" [] \;

字符串

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

相关问题