Respostas:
Na verdade, locate
tem o que é preciso se você usar a --regexp
opção e você não se importa em cuspir arquivos que tenham o mesmo nome que os diretórios que você procura. O marcador de posição "fim de linha" faz o trabalho:
locate -r '/dirname$'
locate
também suporta --ignore-case
se é isso que você quer.
locate -r '/[^\.]*$'
,.
Por que não usar o comando find?
find . -name YOUR_SEARCH_NAME -type d
locate
em si não pode fazer isso por você. Então, a maneira UNIX de fazer isso é filtrar a saída de locate
:
locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +
/tmp/something$(reboot)
arquivo).
locate --null something | xargs -r0 sh -c 'for i do [ -d "$i" ] && printf "%s\n" "$i"; done' sh {} +
. {}
nunca deve ser embutido no código shell, isso é tão ruim quanto usar eval
dados arbitrários (daí o downvote).
[ -d
também retorna true para links simbólicos para diretórios. Não necessariamente ruim, só vale a pena notar como é diferente, por exemplo find -type d
.
$(reboot)
em seu computador, talvez você não deva executar comandos encontrados na internet com sudo
; D Mas, obrigado por fornecer um melhor versão, sinta-se à vontade para editá-lo ou publicá-lo como resposta, para que ele não se perca nos comentários.
find
como sugerido na resposta de Scott Wilson é o que eu teria usado. No entanto, se você realmente precisa usar o DB localizador, uma solução hackish pode ser
sudo strings /var/lib/mlocate/mlocate.db | grep -E '^/.*dirname'
sudo
desde que o banco de dados não é diretamente legível por usuários regulares.strings
para remover metadados (isso faz você também encontrar diretórios para os quais você não tem permissão de leitura, o que locate
geralmente dificulta)./var/lib/mlocate/mlocate.db
é o caminho DB no Ubuntu, aparentemente (como um exemplo. Outras distribuições podem tê-lo em outros lugares, por exemplo /var/lib/slocate/slocate.db
).grep -E
para ativar expressões regulares.^/.*dirname
irá coincidir com todas as linhas que começam com a /
, que todos os diretórios no banco de dados acontecem, seguido por qualquer caractere um número de vezes, seguido por sua palavra de pesquisa.Lados positivos desta solução:
find
,grep
(ou outras ferramentas de processamento de texto favoritas).Lados negativos:
locate
em geral (DB deve ser atualizado),Colocando a linha pura de Oliver Salzburg no seu .bashrc
:
# locate directories:
# -------------------
locd () {
locate $1 | xargs -I {} bash -c 'if [ -d "{}" ]; then echo {}; fi'
}
então você pode digitar locd something
toda vez que quiser localizar apenas diretórios.
locate -i --all $1 | xargs -I {} bash -c 'if [ -d "'"{}"'" ]; then echo "'"{}"'"; fi'
Colocá-los como últimas linhas ou sempre que melhor se encaixa para você.
gedit ~ / .bashrc
espero que isso ajude, aplausos
#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 ; }
Eu fui com esta solução:
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