locate, which e whereis - Três Formas de Encontrar Comandos no Linux

locate, which e whereis - Três Formas de Encontrar Comandos no Linux

O Que Você Vai Aprender

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

Ao final deste artigo você será capaz de:


1. which -- "Qual executável meu shell realmente executa?"

Conclusão: which pesquisa o PATH em ordem e mostra o único executável que seu shellUm programa interativo que interpreta os comandos digitados e os executa. executa.

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

Uso básico

which python3
/usr/bin/python3

which pesquisa os diretórios listados na sua variável de ambienteUm valor nomeado que o shell ou um programa pode consultar durante a execução. PATH, em ordem, e mostra a primeira correspondência encontrada.

which git
/usr/bin/git

which só pesquisa diretórios no $PATH. Execute echo $PATH para ver quais diretórios estão incluídos.

Quando um comando não é encontrado

which nonexistent-command

Sem saída (código de saída 1). Algumas distribuições mostram uma mensagem como:

which: no nonexistent-command in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
Lina: Por que não tem saída?
Veterano Linny: Significa que o comando não está em nenhum lugar do seu PATH -- ou não está instalado, ou o diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. de instalação não está no PATH.

Útil quando múltiplas versões estão instaladas

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

Você pode ver de imediato qual versão cada nome aponta.


2. whereis -- "Mostre o binário, página man e código-fonte juntos"

Conclusão: whereis encontra o binário, página man e código-fonte de uma vez, ignorando seu PATH.

Lina: Eu consigo obter o caminho com which. O que whereis acrescenta?
Veterano Linny: which só mostra o único executável que seu shell executaria agora. whereis mostra o binário, a página man e às vezes o código-fonte -- tudo de uma vez. E não se limita ao seu PATH atual.

Uso básico

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

/usr/bin/ls é o executável. /usr/share/man/man1/ls.1.gz é a página man compactada.

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

O que cada campo significa

Campo Conteúdo
Primeiro caminho após comando: Binário executável
Caminho em /usr/share/man/ Página man
Caminho em /usr/lib/ Bibliotecas ou arquivos de suporte
Caminho em /usr/src/ Código-fonte (se instalado)

Filtrando com opções

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 diretórios padrão 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"

Conclusão: locate consulta um banco de dados pré-construído para encontrar qualquer arquivo por nome, muito rapidamente.

Lina: Para que serve o locate?
Veterano Linny: Não é só para comandos -- você pode encontrar qualquer arquivo por nome, muito rápido. Pense em buscar um arquivo de configuração cuja localização exata você esqueceu. locate é muito mais rápido que find para isso.

Uso básico

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

Por que é tão rápido?

locate não escaneia o sistema de arquivos em tempo real. Ele consulta um banco de dados (índice) pré-construído, e por isso retorna resultados quase instantaneamente.

O banco de dados é tipicamente reconstruído uma vez por dia por uma tarefa agendada executando updatedb. Arquivos criados após a última atualização não aparecerão nos resultados do locate até que o banco de dados seja atualizado.

Reconstruir o banco de dados manualmente

sudo updatedb

Execute isso após criar novos arquivos, e então o locate vai encontrá-los.

Busca sem diferenciar maiúsculas/minúsculas

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 correspondências sem listar todos os caminhos

locate -c python
248

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


4. Escolhendo o Comando Certo

Conclusão: Use which para caminhos, whereis para arquivos relacionados, locate para buscar nomes.

Lina: Ok, você pode me dar uma regra simples de quando usar cada um?
Veterano Linny: Claro -- aqui vai a versão de uma linha para cada um!
Objetivo Comando
Encontrar o executável exato que seu shell rodaria which
Ver o binário, página man e código-fonte juntos whereis
Buscar qualquer arquivo por nome, rapidamente locate
Buscar arquivos recém-criados (ainda não no BD) find

Exemplos comuns do mundo real

  • python é Python 2 ou Python 3? --> which python
  • Onde está a página man do git? --> whereis git
  • Onde está o nginx.conf? --> locate nginx.conf
  • Acabei de instalar algo e preciso encontrá-lo agora --> sudo updatedb && locate filename

5. Perguntas Frequentes e Armadilhas

Conclusão: Quando which não retorna nada, use whereis ou locate; execute updatedb para dados atualizados.

P. which não retorna nada -- o comando está realmente instalado?

Lina: Executei which node e não obtive nada. Eu pensei que tinha instalado...
Veterano Linny: Tente whereis node e locate node | grep bin primeiro. Eles fazem uma busca mais ampla. Também verifique echo $PATH -- talvez o diretório de instalação simplesmente não 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 você acabou de criar não aparece:

sudo updatedb
locate the-file-you-want

P. comando locate não encontrado

# Debian / Ubuntu
sudo apt install mlocate

# Fedora / RHEL / CentOS
sudo dnf install mlocate

Próximas Leituras