Как я могу использовать поиск только для каталога

10

Это находит большое количество файлов, которые находятся в различных подкаталогах "Dropnot"

$ locate Dropnot

Могу ли я найти только каталог с locate? (какой каталог "Dropnot" находится в)

Так что, если Dropnotесть /home/me/, это единственная запись, которая возвращается.

Если так, какой самый простой / кратчайший путь?

Желательно с помощью флага или символа, а не прокачивать и подбадривать его и т. Д., Но я бы взял что-нибудь как вариант.

Может быть, что-то вроде Dropnot $ для конца строки? (но не сработало).

Майкл Даррант
источник

Ответы:

5

Нет возможности использовать, locateчтобы найти выбранный тип файла (например, каталог), но вы можете использовать синтаксис из своего вопроса - Dropnot$чтобы найти строки, которые заканчиваются Dropnot. Для этого вы должны использовать -eопцию locate, чтобы включить регулярное выражение POSIX.

В этом случае вы должны использовать:

locate -e Dropnot$

Важно, какая версия у вас есть. В моей системе (Gentoo Linux) у меня есть безопасный поиск:

$ locate --version
Secure Locate 3.1 - Released March 7, 2006

в котором нет --basenameварианта из utherответа. Эта опция предоставляется GNU Locate из пакета findutils:

$ ./locate --version
locate (GNU findutils) 4.4.2

Если вы хотите использовать регулярное выражение с GNU Locate, вы должны -rвместо этого использовать switch -e.

постоянный репер
источник
1
не -eвариант only print entries for currently existing files?
phuclv
10

Я mlocateустановил. Это стандартная версия, распространяемая RedHat, поэтому она будет использоваться в Fedora, RHEL, CentOS. Отman 1 locate

-b, --basename
       Match  only  the  base  name  against the specified patterns. This 
       is the opposite of --wholename.

Так что, если вы запустите locate -b '\Dropknot', он будет сообщать только файлы или каталоги именно с этой строкой.

Because \ is a globbing character, this disables the implicit replacement 
of NAME by *NAME*.
Джордж М
источник
locate -b /Dropnotработал
Майкл Даррант
4

С помощью GNU locate (другие реализации locate могут отличаться):

locate '*/Dropnot'
locate Dropnot | grep '/Dropnot$'

Если в аргументе нет подстановочного знака locate, выполняется поиск пути с указанным поисковым термином в качестве подстроки. Когда аргумент является шаблоном оболочки, содержащим один или несколько символов подстановки, locateищет полное совпадение. Если вы не хотите выводить /Dropnotв конце:

locate -0 '*/Dropnot' | xargs -0 -n1 dirname
locate Dropnot | sed -n 's:/Dropnot$::p'
Жиль "ТАК - перестань быть злым"
источник
0

Если вы работаете в RedHat, возможно, у вас установлен mlocate, а не Secure Locate. В этом случае нет опции -e, и вы должны использовать -r или --regexp для поиска с использованием основных регулярных выражений.

Jistanidiot
источник
0

slocateПо умолчанию Slackware использует поиск по регулярному выражению с опцией r :

locate -r '/Dropnot$'

будет искать каталоги по имени Dropnot.

Это поиск , например , для пронумерованных -Только Dropnotкаталогов (Dropnot1, Dropnot2 и т.д.):

locate -r '/Dropnot[[:digit:]]\+$'
Скиппи ле Гран Гуру
источник
0

Не знаю, почему никто не предложил что-то подобное:

for i in $(locate MYDIR); do [ -d "$i" ] && echo $i; done

Это просто проверяет, является ли какая-либо из строк locate каталогом, и печатает его

cy8g3n
источник