Usando localizar para encontrar um diretório

20

Eu uso localizar o tempo todo para encontrar arquivos que eu sei o nome de, localizar é muito rápido e eu amo isso. Para arquivos criados recentemente, a localização é ótima, normalmente com arquivos criados recentemente, eu sei onde eles foram criados, basicamente, para que eu não precise pesquisar todo o meu sistema de arquivos.

Quando eu esqueci a localização de um diretório, no entanto, nem encontrar nem localizar parecem ideais.

A localização sempre gera informações demais, pois todos os arquivos em um diretório também correspondem à localização. Por exemplo, se eu estivesse procurando um diretório chamado log em algum lugar do meu sistema de arquivos, o registro de localização retornaria muitos e muitos resultados. Se eu fizer o mesmo com o find, find / -name log -type d find leva alguns minutos para executar e cospe todos os tipos de erros de permissão toda vez que encontra uma pasta que não consegue ler.

Existe uma maneira melhor?

Resposta: Então, continuarei com o grep até encontrar outra coisa:

locatedir () {
    for last; do true; done
    if [[ $last == *\/* ]]
    then
        locate $@ | grep "${last}\$"
    else
        locate $@ | grep "/${last}\$"
    fi
}
Michael
fonte

Respostas:

12

Uma maneira (suspeito que possa haver uma maneira melhor) é usar o grep para retornar apenas os caminhos que terminam no nome da sua pasta:

locate foldername | grep /foldername$
misterben
fonte
28

Você pode usar a opção --regex( -r) de locate:

locate -r '/log$'
Florian Diesch
fonte
Sim (+1). locatetem a sua própria base de capablility regex: -rou --regex... para a gama completa de opções, consulte: Informações localizar
Peter.O
11
Eu sabia que devia haver uma maneira melhor!
misterben
Tão curto e funciona sem problemas. Grande contribuição! Outro motivo para aprender / dominar expressões regulares
loved.by.Jesus
Você não precisa dos dois 'neste caso: locate -r /log$é suficiente.
simlev
5

Você tentou:

locate /home/insertusernamehere/*/filename?

ou

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

ou alguma variação de tal?

RolandiXor
fonte
Essa resposta mostra que grepnão é necessário e, como visto na primeira opção sugerida, também não são regexps.
Tom
2

Aqui está

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

locatedir $*
Linuxuser
fonte
11
Se você puder explicar quais alterações você fez, será útil para outros também.
Ron