Linux CLI находит пути dir без их дочерних элементов - в результате только родительские пути - PullRequest
1 голос
/ 11 апреля 2020

У меня есть это дерево каталогов:

/tmp/find-test/
├── one
│   ├── abc
│   │   ├── one
│   │   └── two
│   └── def
│       ├── one
│       └── two
└── two
    ├── abc
    │   ├── one
    │   └── two
    └── def
        ├── one
        └── two

и то же самое для find-test2

/tmp/find-test2/
├── one
│   ├── abc
│   │   ├── one
│   │   └── two
│   └── def
│       ├── one
│       └── two
└── two
    ├── abc
    │   ├── one
    │   └── two
    └── def
        ├── one
        └── two

Если я выдаю:

find /tmp -ipath "*find-test*" -type d

, я получаю:

/tmp/find-test
/tmp/find-test/two
/tmp/find-test/two/def
/tmp/find-test/two/def/two
/tmp/find-test/two/def/one
...
/tmp/find-test2
/tmp/find-test2/two
/tmp/find-test2/two/def
/tmp/find-test2/two/def/two
/tmp/find-test2/two/def/one
...

но я бы хотел в результате получить только родительские директоры без своих детей. Желаемым результатом должны быть только эти два родительских пути:

/tmp/find-test
/tmp/find-test2

и аналогично, если я введу команду:

find /tmp -ipath "*one*" -type d

Я хотел бы получить только:

/tmp/find-test/one
/tmp/find-test/two/abc/one
/tmp/find-test/two/def/one
/tmp/find-test2/one
/tmp/find-test2/two/abc/one
/tmp/find-test2/two/def/one

Обратите внимание, что это, например, без:

/tmp/find-test/one/abc/one

, поскольку он уже поддерживается сценарием

/tmp/find-test/one

для репликации деревьев каталогов:

mkdir -p /tmp/find-test1/{one,two}/{abc,def}/{one,two}
mkdir -p /tmp/find-test2/{one,two}/{abc,def}/{one,two}

и команды find:

find /tmp -ipath "*find-test*" -type d
find /tmp -ipath "*one*" -type d

Я хотел бы спросить, как использовать команду find, чтобы получить желаемый результат, содержащий только родительские пути, соответствующие шаблону.

Мне нужно использовать -ipath включите, чтобы я мог сопоставлять пути с большим количеством условий, но все же только родительские пути являются желаемым результатом.

Я использую sh и bash.

1 Ответ

2 голосов
/ 11 апреля 2020

Используйте -prune. Я использовал вашу команду для репликации дерева каталогов и выдал ваши команды с -prune, что привело к:

$ find 2>&- /tmp -ipath '*find-test*' -type d -prune
/tmp/find-test2
/tmp/find-test1
$ find 2>&- /tmp -ipath '*one*' -type d -prune
/tmp/find-test2/two/def/one
/tmp/find-test2/two/abc/one
/tmp/find-test2/one
/tmp/find-test1/two/def/one
/tmp/find-test1/two/abc/one
/tmp/find-test1/one
...