Linux / Comando whereis: localizar binários, fontes e manuais

O comando whereis procura arquivos relacionados a um programa, como binários, fontes e páginas de manual, em um conjunto de diretórios de busca. Ele serve para localizar esses diferentes tipos de arquivo pelo nome; para saber o que o shell executará, consulte type ou command -v.

As opções descritas seguem o whereis do util-linux, conforme seu manual e a fonte oficial do manual. A prática usa Bash e utilitários GNU para preparar uma pasta exclusiva com um script, uma cópia, um arquivo de fonte C e uma página de manual fictícia. Não é necessário instalar esses arquivos em pastas do sistema.

O util-linux whereis combina locais conhecidos da instalação com informações de PATH e MANPATH, conforme o tipo de busca. Ele não percorre recursivamente todo o disco. Uma árvore personalizada pode ficar fora da busca padrão; as opções -B, -M e -S permitem fornecer diretórios para cada categoria, e -l ajuda a conferir os locais usados.

Sintaxe básica

whereis [opções] [-BMS diretório... -f] nome...

opções e nome são marcadores. Confira whereis --version, whereis --help e man whereis no Linux de destino, pois ferramentas de mesmo nome em outros sistemas podem se comportar de outra forma. Nomes, tipos e diretórios têm papéis diferentes: -b, -m e -s selecionam categorias; -B, -M e -S delimitam onde procurá-las. -f encerra as listas de diretórios e inicia os nomes a consultar.

Uso básico do whereis

Preparar arquivos e procurar categorias relacionadas

Execute a preparação no mesmo terminal e pare se houver erro. O script demo_tool apenas imprime demonstracao; demo_tool.c é uma fonte mínima, e demo_tool.1 é um arquivo de manual simples. A cópia em extra será usada depois para mostrar uma segunda localização de binário. A consulta final limita as três categorias às pastas criadas: deve associar demo_tool ao script em bin, à fonte em src e ao manual em man1. A cópia de extra fica fora dessa primeira consulta. A busca não compila a fonte nem abre o manual.

whereis_demo=$(mktemp -d -p "$PWD" 'whereis-demo.XXXXXXXX') &&
mkdir -- "$whereis_demo/bin" "$whereis_demo/extra" \
  "$whereis_demo/src" "$whereis_demo/man1" &&
printf '%s\n' '#!/bin/sh' 'printf "demonstracao\n"' > "$whereis_demo/bin/demo_tool" &&
chmod +x -- "$whereis_demo/bin/demo_tool" &&
cp -- "$whereis_demo/bin/demo_tool" "$whereis_demo/extra/demo_tool" &&
printf '%s\n' 'int main(void)' '{' '    return 0;' '}' > "$whereis_demo/src/demo_tool.c" &&
printf '%s\n' '.TH DEMO_TOOL 1' '.SH NAME' \
  'demo_tool \- programa de demonstracao' > "$whereis_demo/man1/demo_tool.1" &&
whereis -B "$whereis_demo/bin" -M "$whereis_demo/man1" \
  -S "$whereis_demo/src" -f demo_tool

Procurar apenas na categoria de binários

O -b seleciona binários, enquanto -B escolhe seus diretórios. Com a pasta bin da prática, o resultado deve incluir o caminho terminado em /bin/demo_tool. O nome da categoria não prova que um arquivo seja um programa funcional ou que tenha as permissões necessárias: whereis localiza candidatos pelo nome e pelo diretório. Para uma instalação real, uma consulta como whereis -b ssh depende dos diretórios e arquivos presentes no sistema.

whereis -b -B "$whereis_demo/bin" -f demo_tool

Procurar apenas arquivos de manual

O -m seleciona a categoria de manuais, e -M restringe a busca à pasta man1 preparada. O resultado deve terminar em /man1/demo_tool.1. A localização de um arquivo não significa que o comando man esteja instalado, que o arquivo seja a documentação da versão em uso ou que a busca padrão de man inclua essa pasta. Para localizar apenas a fonte da prática, use whereis -s -S "$whereis_demo/src" -f demo_tool.

whereis -m -M "$whereis_demo/man1" -f demo_tool

Interpretar uma linha com binário e manual

Uma consulta a um programa instalado, como ls, pode trazer o nome seguido de dois-pontos e vários caminhos. Os resultados variam: algumas instalações têm o executável, mas não a documentação local, ou usam outros diretórios e formatos de compressão. O exemplo abaixo ilustra a separação entre um caminho de binário e um arquivo de manual; ele não é uma saída garantida desta prática.

whereis ls

Ilustração do formato, com caminhos que dependem da instalação:

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

Nessa ilustração, /usr/bin/ls é o caminho do executável e /usr/share/man/man1/ls.1.gz é o arquivo de manual comprimido. Para saber qual ls o shell resolverá naquele contexto, consulte type ls ou command -v ls. Se aparecer apenas nome:, nenhum candidato foi mostrado naquela busca; isso não comprova que o programa esteja ausente de todos os diretórios do sistema. Não use o estado de saída isoladamente como uma contagem de resultados.

Principais opções

Opção Função no util-linux whereis
-b Selecionar a busca de binários.
-m Selecionar manuais e documentação Info reconhecida pela implementação.
-s Selecionar arquivos de fonte.
-B DIRS -f Definir os diretórios da categoria de binários; não substituir o papel de -b.
-M DIRS -f Definir os diretórios de manuais; usar -m quando só essa categoria for desejada.
-S DIRS -f Definir os diretórios de fontes; usar -s quando só essa categoria for desejada.
-u Filtrar entradas que a implementação considera incomuns; conferir o comportamento da versão antes de usá-lo em auditorias.
-l Listar os caminhos efetivos de busca, inclusive o efeito dos diretórios personalizados.

O filtro -u não é uma verificação de segurança ou integridade. Também não deve ser usado sozinho para provar a ausência de um arquivo: a contagem e o tratamento de casos sem correspondência precisam ser confirmados na implementação instalada. Para conferir uma categoria de maneira direta, selecione -b, -m ou -s e examine os caminhos retornados.

Exemplos práticos

Listar os diretórios efetivos

No Linux, whereis -l mostra os caminhos conhecidos que a instalação consegue usar. O bloco abaixo mostra o efeito de fornecer as três listas da prática, sem depender das pastas padrão do sistema. Confira os rótulos de categoria e os diretórios, em vez de presumir uma lista universal. A disponibilidade e as permissões dos diretórios podem afetar o que entra na busca.

whereis -B "$whereis_demo/bin" -M "$whereis_demo/man1" \
  -S "$whereis_demo/src" -f -l

Fornecer dois diretórios para a mesma categoria

A lista após -B contém bin e extra como dois argumentos separados, ambos entre aspas para preservar espaços nos caminhos. -f marca o fim dessa lista; demo_tool é o nome pesquisado. Com -b, só a categoria de binários é selecionada, e os dois diretórios devem fornecer candidatos. Informar apenas -B, sem -b, pode deixar outras categorias ativas; restringir um diretório e escolher um tipo são operações distintas.

whereis -b -B "$whereis_demo/bin" "$whereis_demo/extra" -f demo_tool

Separar resolução do shell e localização de documentação

O subshell acrescenta bin ao início de PATH e consulta command -v demo_tool; em seguida, o whereis procura somente o arquivo de manual em man1. Assim, a primeira resposta corresponde à resolução do shell, enquanto a segunda se refere a um arquivo relacionado. O PATH do terminal principal permanece como estava ao sair dos parênteses. Nenhuma das consultas executa o script demo_tool.

(
  PATH="$whereis_demo/bin:$PATH"
  export PATH
  command -v demo_tool
  whereis -m -M "$whereis_demo/man1" -f demo_tool
)

Comparar whereis e outros comandos

Comando Função principal Quando usar
whereis Consultar locais de arquivos relacionados Localizar binários, fontes e manuais pelo nome
which Consultar executáveis em PATH Comparar caminhos de programas externos e sua ordem
type Classificar nomes no shell Conferir aliases, funções, comandos internos e arquivos
find Percorrer caminhos definidos Buscar na árvore atual, com condições de nome ou metadados

Cuidados importantes

Não confundir a busca com uma varredura completa

Uma instalação fora dos diretórios consultados pode não aparecer. Comece por -l e depois indique os diretórios apropriados, sem ampliar a busca mais do que o necessário. Para percorrer uma árvore arbitrária, use find com um ponto inicial definido. O locate consulta um índice de nomes, com outro escopo e outras limitações de atualização; ele também não garante uma visão completa e atual de todo o disco.

Passar o nome e interpretar as regras de correspondência

Prefira o nome do programa, como demo_tool, ao caminho de um arquivo específico. O util-linux remove componentes de diretório iniciais do nome consultado e aplica regras próprias para nomes de fontes e manuais, incluindo alguns sufixos e formatos comprimidos. Portanto, fornecer um caminho completo não transforma a consulta em um teste de identidade daquele arquivo. A implementação de whereis mostra que a categoria e a comparação de nomes não equivalem a validar o conteúdo, a permissão de execução ou a autenticidade do candidato.

Manter os tipos e as listas na ordem correta

Coloque -f após as listas personalizadas. As restrições se aplicam aos nomes que vêm depois; novas restrições podem mudar a categoria para os nomes seguintes. Por exemplo, no util-linux, whereis -bm ls tr -m gcc pesquisa binários e manuais de ls e tr, mas só manuais de gcc. Para reduzir ambiguidades em scripts, prefira chamadas separadas por categoria. Isso também facilita distinguir uma lista de diretórios de uma lista de programas.

Perguntas frequentes

O whereis pesquisa apenas PATH?

Não. O util-linux usa locais conhecidos e informações de PATH e MANPATH, conforme a categoria. A opção -l ajuda a conferir os caminhos efetivos; -B, -M e -S permitem substituí-los para as categorias correspondentes.

Por que uma instalação personalizada não aparece?

A pasta pode estar fora da busca, não estar acessível ou o nome não corresponder às regras da implementação. Para um binário em uma pasta conhecida, use uma forma como whereis -b -B /pasta/dos/programas -f NOME, substituindo os marcadores pelos valores reais.

Como ver os diretórios de busca?

No util-linux, use whereis -l. Ao fornecer listas personalizadas, -l também ajuda a verificar seu efeito. Não presuma que todos os sistemas tenham as mesmas pastas de binários, fontes ou manuais.

Como procurar fora desses diretórios?

Use find com o ponto inicial apropriado para examinar a árvore atual. Para nomes já indexados, locate pode ajudar, mas é necessário conferir quais pastas o banco inclui e quando ele foi atualizado. Nenhum dos dois comprova que o shell escolherá um caminho específico ao receber apenas um nome.