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.




