Использование locate для поиска каталога

20

Я постоянно использую locate, чтобы найти файлы, имена которых мне известны, локация очень быстрая, и мне это нравится. Для недавно созданных файлов поиск отличный, обычно с недавно созданными файлами я знаю, где они были созданы, поэтому мне не нужно искать всю мою файловую систему.

Когда я забыл, где находится каталог, ни найти, ни найти не кажутся идеальными.

Locate всегда выдает слишком много информации, потому что каждый файл в каталоге также подходит для locate. Например, если бы я искал каталог с именем log где-нибудь в моей файловой системе, журнал locate вернул бы тонны и тонны результатов. Если я сделаю то же самое с find, find / -name log -type d find занимает несколько минут и выдает всевозможные ошибки прав доступа каждый раз, когда сталкивается с папкой, которую не может прочитать.

Есть ли способ лучше?

Ответ: Так что я придерживаюсь grep, пока не найду что-то еще:

locatedir () {
    for last; do true; done
    if [[ $last == *\/* ]]
    then
        locate $@ | grep "${last}\$"
    else
        locate $@ | grep "/${last}\$"
    fi
}
Майкл
источник

Ответы:

12

Один из способов (я подозреваю, что может быть и лучше) - использовать grep, чтобы возвращать только те пути, которые заканчиваются именем вашей папки:

locate foldername | grep /foldername$
misterben
источник
28

Вы можете использовать опцию --regex( -r) из locate:

locate -r '/log$'
Флориан Диш
источник
Да (+1) locateимеет собственную встроенную возможность регулярных выражений: -rили --regex... для полного диапазона параметров см .: info locate
Peter.O
1
Я знал, что должен быть лучший способ!
Мистербен
Так коротко и работает плавно. Большой вклад! Еще одна причина, чтобы учиться / освоить регулярные выражения
love.by.Iesus
Вам не нужны два 'в этом случае: locate -r /log$достаточно.
Симлев
5

Ты пробовала:

locate /home/insertusernamehere/*/filename?

или

locate file | grep -i '^/home/.*/examplesubdirectory'?

или какая-то вариация такая?

RolandiXor
источник
Этот ответ показывает, что в grepэтом нет необходимости, и, как видно из первого предложенного варианта, также не являются регулярными выражениями.
Том
2

Вот

locatedir () {
    locate "$*" | while read line
    do 
    if [ -d "$line" ] ; then echo $line ; fi
    done
}

locatedir $*
LinuxUser
источник
1
Если вы сможете объяснить, какие изменения вы внесли, это будет полезно и другим.
Рон