如何使用“查找”修剪一些目录,同时保留一些子目录

时间:2014-01-07 02:15:09

标签: shell find

有一个例子:

#tree
.
├── dir1
│   ├── file1
│   ├── subdir1
│   │   └── file11
│   ├── subdir2
│   │   └── file12
│   ├── subdir3
│   ├── subdir4
│   ├── subdir5
│   └── subdir6
├── dir2
├── dir3
│   └── dir1
│       └── file11
├── dir4
├── dir5
└── dir6

以下命令查找dir1dir2下的所有文件。

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

我的问题是如何查找除dir1dir2以外的所有文件,同时仍搜索到子目录:./dir/subdir1

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

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

忘记提及我只想知道如何在命令find中使用逻辑组合:-o -a -not等来实现这一点。在grep输出后,使用过滤器(sedawkfind)可以解决问题。感谢大家发布了他们的答案。


例外输出:

.
./dir6
./dir5
./dir4
./dir3
./dir3/dir1
./dir3/dir1/file11
./dir1/subdir1
./dir1/subdir1/file11

4 个答案:

答案 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