locate, which e whereis - Tres Formas de Encontrar Comandos no Linux

locate, which e whereis - Tres Formas de Encontrar Comandos no Linux

O Que Voce Vai Aprender

Lina: Linny-senpai, eu instalei um comando mas nao tenho ideia de onde ele foi parar...
Veterano Linny: Isso acontece o tempo todo! O Linux tem tres comandos especificamente para encontrar onde as coisas estao: which, whereis e locate. Cada um faz algo diferente -- vamos ver um por um.

Ao final deste artigo voce sera capaz de:

  • Usar which para encontrar o caminho do executavel de um comando
  • Usar whereis para encontrar o binario, pagina man e codigo-fonte de uma vez
  • Usar locate para buscar qualquer arquivo por nome, rapidamente
  • Saber qual ferramenta usar em cada situacao

1. which -- "Qual executavel meu shell realmente executa?"

Conclusao: which pesquisa o PATH em ordem e mostra o unico executavel que seu shell executa.

Lina: Quando eu usaria which?
Veterano Linny: Digamos que voce tem tanto o Python 2 quanto o Python 3 instalados. Se voce simplesmente digitar python, qual deles roda? which diz exatamente qual arquivo seu shell encontra.

Uso basico

which python3
/usr/bin/python3

which pesquisa os diretorios listados na sua variavel de ambiente PATH, em ordem, e mostra a primeira correspondencia encontrada.

which git
/usr/bin/git

which so pesquisa diretorios no $PATH. Execute echo $PATH para ver quais diretorios estao incluidos.

Quando um comando nao e encontrado

which nonexistent-command

Sem saida (codigo de saida 1). Algumas distribuicoes mostram uma mensagem como:

which: no nonexistent-command in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
Lina: Por que nao tem saida?
Veterano Linny: Significa que o comando nao esta em nenhum lugar do seu PATH -- ou nao esta instalado, ou o diretorio de instalacao nao esta no PATH.

Util quando multiplas versoes estao instaladas

which python
which python3
/usr/bin/python
/usr/bin/python3

Voce pode ver de imediato qual versao cada nome aponta.


2. whereis -- "Mostre o binario, pagina man e codigo-fonte juntos"

Conclusao: whereis encontra o binario, pagina man e codigo-fonte de uma vez, ignorando seu PATH.

Lina: Eu consigo obter o caminho com which. O que whereis acrescenta?
Veterano Linny: which so mostra o unico executavel que seu shell executaria agora. whereis mostra o binario, a pagina man e as vezes o codigo-fonte -- tudo de uma vez. E nao se limita ao seu PATH atual.

Uso basico

whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

/usr/bin/ls e o executavel. /usr/share/man/man1/ls.1.gz e a pagina man compactada.

whereis python3
python3: /usr/bin/python3 /usr/lib/python3 /usr/share/man/man1/python3.1.gz

O que cada campo significa

Campo Conteudo
Primeiro caminho apos comando: Binario executavel
Caminho em /usr/share/man/ Pagina man
Caminho em /usr/lib/ Bibliotecas ou arquivos de suporte
Caminho em /usr/src/ Codigo-fonte (se instalado)

Filtrando com opcoes

whereis -b ls   # somente binario
whereis -m ls   # somente pagina man
whereis -s ls   # somente codigo-fonte
ls: /usr/bin/ls
ls: /usr/share/man/man1/ls.1.gz
ls:

Diferente de which, whereis pesquisa um conjunto fixo de diretorios padrao do sistema (/bin, /usr/bin, /usr/local/bin, etc.) independentemente do seu PATH atual. Isso significa que ele pode encontrar um comando mesmo se o PATH estiver mal configurado.


3. locate -- "Buscar qualquer arquivo por nome, rapidamente"

Conclusao: locate consulta um banco de dados pre-construido para encontrar qualquer arquivo por nome, muito rapidamente.

Lina: Para que serve o locate?
Veterano Linny: Nao e so para comandos -- voce pode encontrar qualquer arquivo por nome, muito rapido. Pense em buscar um arquivo de configuracao cuja localizacao exata voce esqueceu. locate e muito mais rapido que find para isso.

Uso basico

locate ssh_config
/etc/ssh/ssh_config
/usr/share/doc/openssh-client/examples/ssh_config

Por que e tao rapido?

locate nao escaneia o sistema de arquivos em tempo real. Ele consulta um banco de dados (indice) pre-construido, e por isso retorna resultados quase instantaneamente.

O banco de dados e tipicamente reconstruido uma vez por dia por uma tarefa agendada executando updatedb. Arquivos criados apos a ultima atualizacao nao aparecerao nos resultados do locate ate que o banco de dados seja atualizado.

Reconstruir o banco de dados manualmente

sudo updatedb

Execute isso apos criar novos arquivos, e entao o locate vai encontra-los.

Busca sem diferenciar maiusculas/minusculas

locate -i README
/home/user/projects/readme.md
/usr/share/doc/curl/README
/usr/share/doc/git/README.md

Combinar com grep para filtrar resultados

locate nginx | grep conf
/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf

Contar correspondencias sem listar todos os caminhos

locate -c python
248

Se locate nao estiver instalado, instale com sudo apt install mlocate (Debian/Ubuntu) ou sudo dnf install mlocate (Fedora/RHEL).


4. Escolhendo o Comando Certo

Conclusao: Use which para caminhos, whereis para arquivos relacionados, locate para buscar nomes.

Lina: Ok, voce pode me dar uma regra simples de quando usar cada um?
Veterano Linny: Claro -- aqui vai a versao de uma linha para cada um!
Objetivo Comando
Encontrar o executavel exato que seu shell rodaria which
Ver o binario, pagina man e codigo-fonte juntos whereis
Buscar qualquer arquivo por nome, rapidamente locate
Buscar arquivos recem-criados (ainda nao no BD) find

Exemplos comuns do mundo real

  • python e Python 2 ou Python 3? --> which python
  • Onde esta a pagina man do git? --> whereis git
  • Onde esta o nginx.conf? --> locate nginx.conf
  • Acabei de instalar algo e preciso encontra-lo agora --> sudo updatedb && locate filename

5. Perguntas Frequentes e Armadilhas

Conclusao: Quando which nao retorna nada, use whereis ou locate; execute updatedb para dados atualizados.

P. which nao retorna nada -- o comando esta realmente instalado?

Lina: Executei which node e nao obtive nada. Eu pensei que tinha instalado...
Veterano Linny: Tente whereis node e locate node | grep bin primeiro. Eles fazem uma busca mais ampla. Tambem verifique echo $PATH -- talvez o diretorio de instalacao simplesmente nao esteja no seu PATH.
# Verificar PATH
echo $PATH

# Busca mais ampla
whereis node

# Buscar em diretorios bin comuns
locate node | grep "/bin/"

P. locate retorna resultados desatualizados

Se um arquivo que voce acabou de criar nao aparece:

sudo updatedb
locate the-file-you-want

P. comando locate nao encontrado

# Debian / Ubuntu
sudo apt install mlocate

# Fedora / RHEL / CentOS
sudo dnf install mlocate

Proximas Leituras