Como usar o locate para procurar apenas pastas

3

Em um sistema UNIX, "locate" procura no banco de dados por arquivos com nome ou arquivos escolhidos dentro da pasta com o nome escolhido. Como posso usar o locate para gerar apenas pastas, não arquivos?

    
por shrx 03.04.2012 / 15:57

7 respostas

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
    
por 03.04.2012 / 23:59
5

Na verdade, locate tem o que é preciso se você usar a opção --regexp e não se importar em cuspir arquivos que tenham o mesmo nome que os diretórios que você procura. O marcador de posição "fim da linha" faz o trabalho:

locate -r '/dirname$'

locate também suporta --ignore-case se é isso que você deseja.

    
por 30.01.2015 / 23:27
2

Por que não usar o comando find?

find . -name YOUR_SEARCH_NAME -type d
    
por 03.04.2012 / 16:08
2

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 {} +
    
por 03.04.2012 / 16:56
1

find , como sugerido na resposta de Scott Wilson, é o que eu teria usado. No entanto, se você realmente precisa usar o DB localizar, uma solução hackish poderia ser

sudo strings /var/lib/mlocate/mlocate.db | grep -E '^/.*dirname'
  • sudo , já que o banco de dados não pode ser lido diretamente por usuários comuns.
  • strings para remover metadados (isso faz com que você também encontre diretórios para os quais você não tem permissão de leitura, o que locate geralmente atrapalha).
  • /var/lib/mlocate/mlocate.db é o caminho do banco de dados 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 corresponderá a todas as linhas que começam com / , que todos os diretórios no banco de dados fazem, seguidas por qualquer caractere várias vezes, seguidas por sua palavra de pesquisa.

Lados positivos desta solução:

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

Lados negativos:

  • o mesmo que locate em geral (o banco de dados deve ser atualizado),
  • você precisa de acesso root.
por 03.04.2012 / 16:35
1

Colocando a linha legal de Oliver Salzburg em 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.

    
por 08.02.2015 / 19:13
0

Coloque-as como últimas linhas ou onde melhor couber para você.
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 ; }


espero que isso ajude, felicidades

    
por 03.04.2012 / 19:04

Tags