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