Як я можу використовувати пошук лише для каталогу


10

Це знаходить велику кількість файлів, які знаходяться в різних підкаталогах "Dropnot"

$ locate Dropnot

Чи можу я знайти лише місце розташування каталогу locate? (в якій папці "Dropnot" є)

Тож якщо він Dropnotє /home/me/, це єдиний запис, який повертається.

Якщо так, то який найпростіший / найкоротший спосіб?

Переважно через прапор чи символ, а не обшивку та привітання до нього тощо, але я б взяв що-небудь як варіант.

Може, якийсь Dropnot $ для кінця рядка? (але не вийшло)

Відповіді:


5

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

У цьому випадку слід використовувати:

locate -e Dropnot$

Важливо, яка у вас версія локації. У своїй системі (Gentoo Linux) у мене є безпечне місцезнаходження:

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

в якому немає --basenameваріанту з utherвідповіді 's. Ця опція надається GNU Locate з пакета findutils:

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

Якщо ви хочете використовувати regexp з GNU Locate, -rзамість цього слід використовувати перемикач -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 '*/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 для пошуку за допомогою основних регулярних виразів.


0

Slackware використовує slocateза замовчуванням, у якому є пошук регулярного вибору з опцією r :

locate -r '/Dropnot$'

буде шукати каталоги з іменем Dropnot.

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

locate -r '/Dropnot[[:digit:]]\+$'

0

Не знаю, чому ніхто не пропонував щось подібне:

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

Це просто перевіряє, чи будь-який з рядків пошуку є каталогом, і друкує його

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.