Linux / Comando locate: buscar caminhos no índice e verificar resultados

O comando locate procura caminhos em um índice de nomes criado anteriormente, em vez de percorrer toda a árvore a cada consulta. Isso costuma tornar a busca rápida, mas o resultado pode omitir arquivos novos ou mostrar caminhos que já mudaram. Para verificar o estado atual com condições de tipo, tamanho ou data, use find.

A prática abaixo usa especificamente o GNU locate e o updatedb do GNU Findutils, com Bash e utilitários GNU. Ela cria um índice separado contendo apenas arquivos de demonstração, sem sudo nem alteração do índice padrão. Execute os blocos na ordem apresentada e no mesmo terminal. Os nomes usados não correspondem a configurações reais do sistema.

Identificar a implementação e o índice

O nome locate pode ser fornecido por GNU locate, mlocate ou plocate. Confirme locate --version e updatedb --version antes da prática: ambos devem indicar GNU Findutils para os argumentos de criação usados aqui. As opções de updatedb, o formato do banco, a filtragem de nomes e a combinação de padrões variam. O serviço do sistema pode atualizar o índice por timer ou cron, conforme o pacote e a distribuição; a existência do comando não prova que esse agendamento está ativo.

Sintaxe básica

locate [opções]... padrão...

opções e padrão são marcadores. Uma string simples, como nginx.conf, normalmente procura esse trecho no caminho inteiro. Um padrão com *, ? ou [] é tratado como glob e precisa corresponder ao campo pesquisado inteiro; por exemplo, '*.service' seleciona caminhos terminados em .service. Proteja esses padrões com aspas para o shell não os expandir primeiro. Consulte também locate --help e man locate.

Uso básico do locate

Preparar um índice próprio e pesquisar um trecho

Para esta prática, escolha uma pasta cujo caminho absoluto use apenas letras ASCII, números, barras, ponto, hífen e sublinhado. O GNU updatedb recebe --localpaths como uma lista separada por espaços, e -d pode interpretar dois-pontos como separador de bancos. A verificação também recusa caracteres de glob para manter os caminhos simples ao chamar o script de atualização; isso é uma restrição desta prática, não uma regra geral para nomes no Linux. A pasta exclusiva contém nginx.conf, README.md, um serviço fictício, hosts, hosts.bak e três nomes cache*.tmp. O bloco cria locate.db fora da subpasta indexada data e consulta apenas esse banco. A saída inicial deve terminar em /data/nginx.conf. Pare se houver erro ou se a verificação do caminho recusar a pasta.

locate_start=$PWD
locate_base=$(pwd -P) &&
case "$locate_base" in
  ''|*[!a-zA-Z0-9/._-]*) printf 'Use um caminho simples, sem espacos.\n' >&2 ;;
  *)
    locate_demo=$(mktemp -d -p "$locate_base" 'locate-demo.XXXXXXXX') &&
    mkdir -- "$locate_demo/data" &&
    printf 'nginx ficticio\n' > "$locate_demo/data/nginx.conf" &&
    printf 'documentacao\n' > "$locate_demo/data/README.md" &&
    printf 'servico ficticio\n' > "$locate_demo/data/demo.service" &&
    printf 'hosts ficticio\n' > "$locate_demo/data/hosts" &&
    printf 'backup ficticio\n' > "$locate_demo/data/hosts.bak" &&
    touch -- "$locate_demo/data/cache01.tmp" \
      "$locate_demo/data/cache02.tmp" "$locate_demo/data/cache03.tmp" &&
    updatedb --localpaths="$locate_demo/data" \
      --netpaths='' --prunepaths='' --prunefs='' \
      --output="$locate_demo/locate.db" &&
    locate -d "$locate_demo/locate.db" nginx.conf
    ;;
esac

Ignorar maiúsculas e minúsculas

A consulta readme.md com -i encontra o arquivo README.md criado na preparação. Sem -i, essa forma em minúsculas não corresponde ao nome em maiúsculas nesta prática. A comparação depende das regras de caracteres da implementação e do locale; não trate essa opção como uma normalização universal de todas as grafias Unicode.

locate -d "$locate_demo/locate.db" -i readme.md

Testar a existência sem descobrir arquivos novos

Este bloco renomeia apenas o serviço fictício da prática para demo.disabled e cria new.service, mantendo o índice antigo. A consulta com -e não imprime nada: demo.service não existe mais naquele caminho, e new.service ainda não foi indexado. Nesse caso, o GNU locate retorna estado 1 por não encontrar correspondência. -e filtra candidatos já presentes no banco; ele não faz uma nova varredura para descobrir nomes ausentes. A falta de resultado, portanto, não prova que nenhum arquivo .service exista na pasta.

mv -- "$locate_demo/data/demo.service" "$locate_demo/data/demo.disabled" &&
printf 'novo servico ficticio\n' > "$locate_demo/data/new.service" &&
locate -d "$locate_demo/locate.db" -e '*.service'

Ver um caminho antigo no índice

Sem -e, a entrada antiga ainda pode aparecer. O exemplo consulta o nome demo.service no banco da prática e remove apenas o prefixo da pasta de demonstração ao exibir a resposta, para que a saída abaixo seja igual em diferentes máquinas. O locate em si retorna o caminho absoluto; o laço Bash apenas apresenta sua parte relativa. A renomeação anterior preservou o conteúdo em demo.disabled, mas não atualizou o banco.

locate -d "$locate_demo/locate.db" -b 'demo.service' |
while IFS= read -r caminho; do
  printf '%s\n' "${caminho#"$locate_demo"/}"
done

Saída esperada após o bloco de renomeação:

data/demo.service

É um resultado do índice, não uma comprovação de existência. Para uma busca atual nesta pasta, find "$locate_demo/data" -type f -name '*.service' -print encontra new.service antes de atualizar o banco. Confira tanto o estado de saída quanto as mensagens de erro. Nas consultas desta prática, a ausência de correspondência retorna 1; uma mensagem de falha ao abrir o banco não deve ser interpretada como prova de que nenhum arquivo existe. Um estado 0 isolado também não comprova que todos os bancos pretendidos foram lidos. Diferencie falta de correspondência, falha de leitura e caminho inexistente.

Principais opções

Opção Efeito no GNU locate
-i Ignorar diferenças de maiúsculas e minúsculas na busca.
-e, --existing Testar a existência dos candidatos do banco; não descobrir nomes novos.
-b, --basename Comparar apenas o último componente do nome, mas imprimir o caminho completo.
-c, --count Contar correspondências em vez de listar caminhos, salvo se -p também pedir a impressão.
-l N, --limit=N Limitar a quantidade de resultados; com -c, a contagem também fica limitada.
-r, --regex Usar expressão regular; no GNU, o dialeto padrão é semelhante ao Emacs e pode ser escolhido por --regextype.
-d BANCO Escolher o banco ou a lista de bancos, em vez do banco padrão.
-0, --null Separar caminhos pelo byte NUL ao passá-los a uma ferramenta compatível, evitando separar nomes por espaços ou quebras de linha.

Exemplos práticos

Selecionar um nome final com mais precisão

No GNU locate, a consulta abaixo encontra apenas hosts, sem hosts.bak. As aspas simples mantêm a barra de '\hosts' no argumento entregue ao programa; essa forma impede a busca implícita de um simples trecho. Já -b hosts também corresponde a hosts.bak. Uma alternativa de glob explícito para esta palavra é -b 'host[s]'. A opção -b retira os nomes de diretórios da comparação, mas não os remove da saída.

locate -d "$locate_demo/locate.db" -b '\hosts'

Contar ou limitar resultados

Os três arquivos cache01.tmp, cache02.tmp e cache03.tmp correspondem ao glob de nome final 'cache*.tmp'. A primeira consulta imprime 3; a segunda mostra no máximo dois caminhos. O limite não significa que só existem dois candidatos. Se combinar -c -l 2, a contagem também para em 2, portanto ela deixa de ser o total completo. Escolher -b evita contar uma entrada apenas porque um diretório do caminho contém a palavra cache.

locate -d "$locate_demo/locate.db" -c -b 'cache*.tmp' &&
locate -d "$locate_demo/locate.db" -l 2 -b 'cache*.tmp'

Atualizar somente o banco da prática

O GNU updatedb abaixo volta a indexar somente data, sem caminhos de rede, e substitui apenas locate.db. Depois, a consulta com -e deve retornar new.service. O nome demo.service deixa de constar no banco, enquanto demo.disabled passa a ser indexado. Esses argumentos longos são específicos do GNU updatedb: não os transfira para o updatedb de outro pacote. Uma atualização do índice geral, muitas vezes feita com sudo updatedb, tem outro escopo, pode exigir administração e gerar trabalho de disco; confirme a política do pacote e o agendamento antes de executá-la.

updatedb --localpaths="$locate_demo/data" \
  --netpaths='' --prunepaths='' --prunefs='' \
  --output="$locate_demo/locate.db" &&
locate -d "$locate_demo/locate.db" -e '*.service'

O plocate usa argumentos diferentes para criar um banco de usuário, como -U e -o, conforme seu manual de updatedb. Isso não torna os formatos de banco intercambiáveis. Use o gerador e o pesquisador da mesma implementação e confira os caminhos incluídos e excluídos. Não remova exclusões do índice do sistema só para fazer um nome aparecer.

Comparar locate e outros comandos

Comando Função principal Quando usar
locate Consultar nomes de um índice Descobrir caminhos, considerando a atualização e o escopo do banco
find Percorrer a árvore atual Testar nomes e metadados atuais em caminhos definidos
which Procurar executáveis externos no PATH Consultar caminhos de programas; command -v e type ajudam na resolução pelo shell
whereis Consultar locais relacionados a programas Procurar binários, fontes e manuais em seus caminhos de busca

Cuidados importantes

Distinguir nome, conteúdo e existência

locate busca nomes de caminhos, não palavras dentro dos arquivos. Uma entrada pode estar desatualizada, ter sido excluída da indexação ou não estar visível ao usuário. -e acrescenta uma verificação de existência naquele instante, mas o caminho ainda pode mudar antes de outro comando usá-lo. Se precisar procurar texto, escolha uma ferramenta de conteúdo, como grep; se precisar de uma verificação atual por tamanho ou data, use find. Ao terminar, volte à pasta inicial com cd -- "$locate_start".

Tratar o banco como uma lista potencialmente sensível

Um banco pode revelar nomes mesmo sem dar acesso ao conteúdo dos arquivos. A filtragem por usuário depende do formato e das permissões: não suponha que um banco de prática do GNU aplique a política de visibilidade de plocate ou mlocate. Guarde a pasta e o banco com acesso adequado e não os compartilhe se contiverem nomes sensíveis. Neste exercício só há nomes fictícios. No plocate, a proteção descrita pelo autor também depende da propriedade, da legibilidade e da configuração do banco; criar um banco por conta própria não reproduz automaticamente a proteção do índice do sistema.

Verificar padrões e opções da implementação

No GNU locate, -r/--regex usa por padrão um dialeto semelhante ao Emacs; não é simplesmente o mesmo que um glob. No plocate, -r/--regexp usa expressões POSIX básicas e --regex usa POSIX estendidas. Outra diferença importante: vários padrões no GNU locate normalmente funcionam como OU, e -A exige todos; no plocate, todos os padrões são exigidos por padrão. Para evitar essa diferença na prática, cada consulta acima usa um só padrão. As comparações e a velocidade dependem também do padrão e do banco; o uso de um índice não garante que toda consulta seja mais rápida que find.

Perguntas frequentes

Por que o comando locate não está disponível?

O pacote pode não estar instalado, ou o comando pode não estar no PATH. Consulte a documentação e o gerenciador de pacotes da distribuição para identificar GNU locate, plocate ou mlocate. Depois de instalar, confirme também como o índice é criado e atualizado; instalar o programa não garante um banco pronto.

Por que um arquivo novo não aparece?

O banco pode ter sido criado antes do arquivo, o caminho pode estar fora do escopo indexado ou o padrão e a política de visibilidade podem excluí-lo. -e não descobre arquivos novos. Para conferir imediatamente uma pasta acessível, pesquise nela com find.

updatedb sempre precisa de sudo?

Não. O banco próprio desta prática do GNU é criado em uma pasta do usuário, sem sudo. O índice do sistema pode exigir privilégios e ter atualizações agendadas. Os argumentos para limitar o escopo e escolher a saída variam entre GNU updatedb e o de plocate/mlocate.

Por que um caminho removido continua no resultado?

A entrada antiga pode permanecer até a próxima atualização do banco correspondente. A opção -e elimina candidatos que já não existem no momento da consulta, sem renovar o índice inteiro. Renomear um arquivo também pode deixar o nome antigo no banco; a próxima atualização precisa incluir o local correto.