Как использовать locate для поиска только папок

в системе UNIX "locate" ищет в базе данных файлы с выбранным именем или файлы в папке с выбранным именем.
Как использовать locate для вывода только папок, а не файлов?

15
задан shrx
12.02.2023 2:35 Количество просмотров материала 2489
Распечатать страницу

7 ответов

на самом деле locate имеет то, что требуется, если вы используете --regexp вариант, и вы не возражаете, выплевывая файлы, которые имеют то же имя, что и каталоги, которые вы ищете. Маркер положения "конец строки" выполняет задание:

locate -r '/dirname$'

locate поддерживает --ignore-case если это то, что вы хотите.

5
отвечен Frank M 2023-02-13 10:23

почему бы не использовать команду find ?

find . -name YOUR_SEARCH_NAME -type d
2
отвечен Scott C Wilson 2023-02-13 12:40

locate сам не может сделать это за вас. Так как для Unix это сделать фильтр на выходе locate:

locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +
2
отвечен Der Hochstapler 2023-02-13 14:57

find как предложено в ответе Скотта Уилсона, я бы использовал. Однако, если вам действительно нужно использовать locate DB, хакерское решение может быть

sudo strings /var/lib/mlocate/mlocate.db | grep -E '^/.*dirname'
  • sudo так как база данных не читается напрямую обычными пользователями.
  • strings, чтобы удалить метаданные (это делает вас также найти каталоги, к которым у вас нет разрешения на чтение, который locate обычно мешает).
  • /var/lib/mlocate/mlocate.db - это путь БД на Ubuntu, по-видимому (как образец. Другие дистрибутивы могут иметь его в других местах, например /var/lib/slocate/slocate.db).
  • grep -E для включения регулярных выражений.
  • ^/.*dirname будет соответствовать всем строкам, начинающимся с /, который все каталоги в БД случается сделать, а затем любой символ несколько раз, а затем слово поиска.

положительные стороны этого решения:

  • это быстрее, чем find,
  • вы можете использовать все колокола и свистки grep (или другие любимые инструменты обработки текста).

отрицательные стороны:

  • аналогично locate В общем (БД должна обновляться),
  • вам нужен root доступ.
1
отвечен Daniel Andersson 2023-02-13 17:14

помещая аккуратную линию Оливера Зальцбурга в свой .bashrc:

# locate directories:
# -------------------
locd () {
    locate  | xargs -I {} bash -c 'if [ -d "{}" ]; then echo {}; fi'
}

затем вы можете ввести locd something каждый раз, когда вы хотите найти только каталоги.

1
отвечен JosephHarriott 2023-02-13 19:31

поместите их в качестве последних строк или там, где это лучше всего подходит для вас.

gedit ~/.bashrc



#system only

slocate() { locate $@ | egrep -v ˆ/home ; }



#system directories only

dslocate() { for directory in `locate $@ | egrep -v ˆ/home`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }



#whole system directories only

dlocate() { for directory in `locate $@`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }



#local user's only

llocate() { locate $@ | egrep ˆ/home ; }



#local user's directories only

ldlocate() { for directory in `locate $@ | egrep ˆ/home`; do if [ -d "$directory" ]; then echo $directory; fi; done ; }




надеюсь, это поможет, ура

0
отвечен tao 2023-02-13 21:48

Я пошел с этим решением:

locate -i "$foldername" | while read line
        do
            if [[ -d "$line" && `echo ${line##*/} | tr [:upper:] [:lower:]` = *`echo $foldername | tr [:upper:] [:lower:]`* ]]; then
                echo "$line"
            fi
        done
0
отвечен shrx 2023-02-14 00:05

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

Ваш ответ

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

Имя
Вверх