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

7 ответов
на самом деле locate имеет то, что требуется, если вы используете --regexp вариант, и вы не возражаете, выплевывая файлы, которые имеют то же имя, что и каталоги, которые вы ищете. Маркер положения "конец строки" выполняет задание:
locate -r '/dirname$'
locate поддерживает --ignore-case если это то, что вы хотите.

почему бы не использовать команду find ?
find . -name YOUR_SEARCH_NAME -type d

locate сам не может сделать это за вас. Так как для Unix это сделать фильтр на выходе locate:
locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +

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 доступ.

помещая аккуратную линию Оливера Зальцбурга в свой .bashrc:
# locate directories:
# -------------------
locd () {
locate | xargs -I {} bash -c 'if [ -d "{}" ]; then echo {}; fi'
}
затем вы можете ввести locd something каждый раз, когда вы хотите найти только каталоги.

поместите их в качестве последних строк или там, где это лучше всего подходит для вас.
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 ; }
надеюсь, это поможет, ура

Я пошел с этим решением:
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

Komp




















