有一个例子:
#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
等来实现这一点。在grep
输出后,使用过滤器(sed
,awk
,find
)可以解决问题。感谢大家发布了他们的答案。
例外输出:
.
./dir6
./dir5
./dir4
./dir3
./dir3/dir1
./dir3/dir1/file11
./dir1/subdir1
./dir1/subdir1/file11
答案 0 :(得分:2)
也许你可以试试:
find . \( -not -path './dir1/*' -and -not -path './dir2/*' -or -path './dir1/subdir1/*' \) -type f
编辑:
考虑到修剪,我认为你应该使用:
find . \( -path './dir1/*' -and -not -path './dir1/subdir1*' -or -path './dir2' \) -prune -or -type f -print
答案 1 :(得分:0)
试试这个:
find . -type f |sed '/.\/dir[12]\/[^/]*$/d'
答案 2 :(得分:0)
>tree
.
├── dir1
│ ├── file1
│ ├── subdir1
│ │ └── file11
│ ├── subdir2
│ │ └── file12
│ ├── subdir3
│ ├── subdir4
│ ├── subdir5
│ └── subdir6
├── dir2
├── dir3
│ └── dir1
│ └── file11
├── dir4
├── dir5
└── dir6
13 directories, 4 files
>find | awk '
{
if($1 !~ /^\.\/dir1$/ && $1 !~ /^\.\/dir2$/) {
if ($1 ~ /^\.\/dir1\//) {
if ($1 ~ /^\.\/dir1\/subdir1(\/|$)/) {
print($1)
}
} else if ($1 !~ /\.\/dir2\//) {
print($1)
}
}
} '
.
./dir6
./dir5
./dir4
./dir3
./dir3/dir1
./dir3/dir1/file11
./dir1/subdir1
./dir1/subdir1/file11
答案 3 :(得分:0)
-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