В системе UNIX "locate" ищет в базе данных файлы с выбранным именем или файлы в папке с выбранным именем. Как я могу использовать locate для вывода только папок, а не файлов?
7 ответов
На самом деле, у locate
есть то, что нужно, если вы используете опцию --regexp
и не возражаете против того, чтобы она выдавала файлы с тем же именем, что и каталоги, которые вы ищете. Маркер положения "конец строки" выполняет свою работу:
locate -r '/dirname$'
locate
также поддерживает --ignore-case
если вы этого хотите.
Почему бы не использовать команду поиска?
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, хакерское решение может быть
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 $1 | 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