Shell 如何使用;查找“;删除一些目录,同时保留一些子目录

Shell 如何使用;查找“;删除一些目录,同时保留一些子目录,shell,find,Shell,Find,有一个例子: #tree . ├── dir1 │ ├── file1 │ ├── subdir1 │ │ └── file11 │ ├── subdir2 │ │ └── file12 │ ├── subdir3 │ ├── subdir4 │ ├── subdir5 │ └── subdir6 ├── dir2 ├── dir3 │ └── dir1 │ └── file11 ├── dir4 ├── dir5 └── dir6

有一个例子:

#tree
.
├── dir1
│   ├── file1
│   ├── subdir1
│   │   └── file11
│   ├── subdir2
│   │   └── file12
│   ├── subdir3
│   ├── subdir4
│   ├── subdir5
│   └── subdir6
├── dir2
├── dir3
│   └── dir1
│       └── file11
├── dir4
├── dir5
└── dir6
以下命令查找除
dir1
dir2
下的文件以外的所有文件

find -not \( -path './dir1' -prune -o -path './dir2' -prune \)
我的问题是如何在仍搜索子目录时查找除
dir1
dir2
以外的所有文件:
/dir/subdir1

我试过一些这样的,但不起作用。我不知道什么是组合逻辑表达式的正确方法

find -not \( \
  \( -path './dir1' -a -not -path './dir1/subdir1' \) -prune -o \
  -path './dir2' -prune \)

忘了提到我只是想知道如何使用命令
find
-o
-a
-not
中的逻辑组合来实现这一点。在
find
输出后使用过滤器(
grep
sed
awk
)可以工作,但超出了我的问题。感谢所有人都发布了他们的答案


例外输出:

.
./dir6
./dir5
./dir4
./dir3
./dir3/dir1
./dir3/dir1/file11
./dir1/subdir1
./dir1/subdir1/file11
试试这个:

find . -type f |sed '/.\/dir[12]\/[^/]*$/d'
也许你可以试试:

find . \( -not -path './dir1/*' -and -not -path './dir2/*' -or -path './dir1/subdir1/*' \) -type f
编辑:

考虑到prune,我认为您应该使用:

find . \( -path './dir1/*' -and -not -path './dir1/subdir1*' -or -path './dir2' \) -prune -or -type f -print
人类发现

-mindepth levels
              Do not apply any tests or actions at levels less than levels (a  non-negative  integer).-min-depth 1 means process all files except the command line arguments.
这不是考试

find dir1 -mindepth N -type f

谢谢你的回答。但是
/dir1/subdir[2345]
应该被排除。@LaputaPrince我用awk更新我的答案。试试看:)。是的,兄弟。请参阅上面@liberize的回答和我的评论。awk很棒,但超出了我的问题。无论如何谢谢你!只要找到一种方法让prune保持在命令中,这应该会更快,因为它不会下降到
dir2
。尝试:
find./-not\(\(-path./dir1*.-和-not-path./dir1/subdir1*.\)-o-path./dir2'-prune\)
find dir1 -mindepth N -type f