6

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

find * -name hi.dat .

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

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

Я не хочу вводить:

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

Спасибо! Amit

4 ответа4

12

Это было бы за -prune но есть небольшая хитрость:

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

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

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

В Баш:

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

Кш и зш работают аналогично.

4

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

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

Предостережение: тест -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
0

Работает по конвейеру grep -v,

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

выглядит везде, но не внутри медиа-каталога

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .