Como usar o locate para procurar apenas pastas


Respostas:


6

Na verdade, locatetem o que é preciso se você usar a --regexpopçã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$'

locatetambém suporta --ignore-casese é isso que você quer.


Para procurar por todos os diretórios locate -r '/[^\.]*$',.
Mateen Ulhaq

A abordagem de Mateen não filtra os diretórios. Ele retorna tudo no banco de dados. O OP estava procurando por um diretório específico e parece saber o nome do diretório que ele quer.
Frank M

3

Por que não usar o comando find?

find . -name YOUR_SEARCH_NAME -type d

4
O locate é mais rápido e eu não preciso que ele esteja atualizado o tempo todo para o meu propósito.
shrx

2

locateem 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 {} +

5
Esse comando apenas reiniciou minha máquina (eu tinha um /tmp/something$(reboot)arquivo).
sch

2
@sch Uau, isso é uma droga
Der Hochstapler

A maneira correta é com algo parecido 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 evaldados arbitrários (daí o downvote).
sch

Observe que [ -dtambé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.
sch

1
@sch: Bem, se você não entende as conseqüências e se você tem o hábito de ter arquivos nomeados $(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.
Der Hochstapler

1

findcomo 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.
  • stringspara remover metadados (isso faz você também encontrar diretórios para os quais você não tem permissão de leitura, o que locategeralmente 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.
  • ^/.*dirnameirá 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:

  • é mais rápido que find,
  • você pode usar todos os sinos e apitos grep(ou outras ferramentas de processamento de texto favoritas).

Lados negativos:

  • o mesmo que locateem geral (DB deve ser atualizado),
  • você precisa de acesso root.

O acesso root para uma tarefa como essa deve ser evitado.
shrx

1

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 somethingtoda vez que quiser localizar apenas diretórios.


Para mim, para lidar melhor com espaços em diretórios, utilizo o seguinte:locate -i --all $1 | xargs -I {} bash -c 'if [ -d "'"{}"'" ]; then echo "'"{}"'"; fi'
user128063

0

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 ; }



0

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

Você pode explicar o que o eco $ {line ## * /} está fazendo?
user128063
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.