locate, which e whereis - Tres Formas de Encontrar Comandos no Linux
O Que Voce Vai Aprender
which, whereis e locate. Cada um faz algo diferente -- vamos ver um por um.Ao final deste artigo voce sera capaz de:
- Usar
whichpara encontrar o caminho do executavel de um comando - Usar
whereispara encontrar o binario, pagina man e codigo-fonte de uma vez - Usar
locatepara buscar qualquer arquivo por nome, rapidamente - Saber qual ferramenta usar em cada situacao
1. which -- "Qual executavel meu shell realmente executa?"
Conclusao:
whichpesquisa o PATH em ordem e mostra o unico executavel que seu shell executa.
which?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)
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:
whereisencontra o binario, pagina man e codigo-fonte de uma vez, ignorando seu PATH.
which. O que whereis acrescenta?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:
locateconsulta um banco de dados pre-construido para encontrar qualquer arquivo por nome, muito rapidamente.
locate?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
whichpara caminhos,whereispara arquivos relacionados,locatepara buscar nomes.
| 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
pythone 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
whichnao retorna nada, usewhereisoulocate; executeupdatedbpara dados atualizados.
P. which nao retorna nada -- o comando esta realmente instalado?
which node e nao obtive nada. Eu pensei que tinha instalado...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