3

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

7 ответов7

5

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

locate -r '/dirname$'

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

3

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

find . -name YOUR_SEARCH_NAME -type d
2

locate себя не может сделать это за вас. Таким образом, UNIX способ сделать это - отфильтровать вывод locate:

locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +
1

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

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

Поместив аккуратную линию Оливера Зальцбурга в ваш .bashrc:

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

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

0

Разместите их как последние строки или там, где они вам больше подходят.
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

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

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

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