Как исключить каталог при использовании find

Я пытаюсь использовать команду find в Unix, и я знаю, как использовать основы. Например, у меня есть четыре папки, A, B, C и D. Под каждой папкой у меня есть файл с именем hi.dat. Чтобы посмотреть во всех папках, я бы сделал:

find * -name hi.dat.

великолепно! Но что теперь делать, если я не хотите посмотреть папку D? Могу ли я попробовать что-то вроде:

find * not D/* -name hi.dat?

Я не хочу типа:

find A/* B/* C/* -name ... потому что я явно больше чем три папки и они были просто использованы в качестве примера.

спасибо!
Amit

30
задан Sam
11.03.2023 1:04 Количество просмотров материала 3068
Распечатать страницу

4 ответа

В Bash:

shopt -s extglob
find !(D) -name hi.dat

Ksh и zsh работают аналогично.

11
отвечен Dennis Williamson 2023-03-12 08:52

что будет -prune - но есть небольшая хитрость:

$ find . \( -name D -prune \) -o -name hi.dat

-prune означает "не искать дальше по этому пути", поэтому вам нужна другая ветвь для каталогов, отличных от D. (-o означает "или".) Пропустить и другие пути:

$ find . \( \( -name D -o -name Dminor \) -prune \) -o -name hi.dat
12
отвечен geekosaur 2023-03-12 11:09

более общая команда поиска

find -path ./D -prune -o -name hi.dat -print

предостережение: the -path тест еще не может быть портативным / частью стандарта POSIX.

обоснование: в структуре каталогов вида

$ find
.
./D
./A
./A/D
./A/D/hi.dat

по сравнению с

$ find . \( -name D -prune \) -o -name hi.dat
./D
./A/D

он будет только список файлов, которые на самом деле искали (явные -print) и не пропускает файлы в подкаталогах с именем D (-path):

$ find -path ./D -prune -o -name hi.dat -print
./A/D/hi.dat
4
отвечен M. Meglio 2023-03-12 13:26

работает трубопровод grep-v,

$ find / -name "*~"|grep -v "/media"

ищет везде, но не внутри каталога

0
отвечен Mick 2023-03-12 15:43

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх