Linha de Comando em Linux: locate e updatedb – parte 03

updatedb é o comando que atualiza  a base de dados do comando locate.

A explicação sobre updatedb já foi vista aqui nesse artigo: “Linha de Comando em Linux: locate e updatedb – parte 01

 

Antes de prosseguirmos em nosso laboratório é bom entendermos que usaremos diversas  opções contendo a palavra “prune”,  como em –add-prunename, –add-prunepath etc…
“prune” é uma palavra do dicionário inglês que significa suprimir ou tirar.  Então em updatedb –add-prunename  “meusDocumentos”  estamos falando que queremos tirar todos os diretórios  chamados meusDocumentos. Ou seja, não queremos que o conteúdo desses diretórios apareçam nos resultados.

Preparando Ambiente para Nosso Laboratório com updatedb

 

Para testes  criei uma nova partição xfs e a montei em /media/xfs_lab. Dentro de xfs_lab foram criados os seguintes arquivos:

[elder@centos65 ~]$ ls -m  /media/xfs_lab/
meuArquivoXFS, meuArquivoXFS02, meuArquivoXFS02.txt

 

Aqui está o conteúdo do arquivo /etc/updatedb.conf

[elder@centos65 ~]$ cat  /etc/updatedb.conf 
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"

 

Usando updatedb com –prunepaths e –add-prunepath

 

Usando –prunepaths

  1. Encontre arquivos contendo “meuArquivo” em seu nome e não fazendo diferença entre minúsculo e maiúsculo(-i)
    [elder@centos65 ~]$ locate meuArquivo

    Acima vemos que nada foi encontrado. Por quê?  Vimos que existem arquivos contendo “meuArquivo” em seus nomes.

    [elder@centos65 ~]$ ls -m /media/xfs_lab/
    meuArquivoXFS, meuArquivoXFS02, meuArquivoXFS02.txt

    Não foi encontrado porque o caminho “/media”  está incluso nos valores da variável  PRUNEPATH

    [elder@centos65 Labs]$ grep "PRUNEPATH" /etc/updatedb.conf 
    PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
    
  2. Retire o caminho “/media” de dentro da variável PRUNEPATH. Temos duas opções, a primeira é acessar o arquivo /etc/updatedb.conf e excluirmos “/media”  ou usamos a opção “–prunepaths” do comando updatedb para sobrescrevermos  PRUNEPATH em /etc/updatedb.conf. Usarei essa segunda opção.
    [elder@centos65 Labs]$ sudo updatedb --prunepaths "/afs /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
  3. Repita a procura pelo arquivo “meuArquivo”
    [elder@centos65 Labs]$ locate -i  meuArquivo
    /media/xfs_lab/meuArquivoXFS
    /media/xfs_lab/meuArquivoXFS02
    /media/xfs_lab/meuArquivoXFS02.txt

    Prontinho, agora foram encontrados os arquivos.

  4. Adicionaremos os arquivos “arquivozinho01.txt” e “arquivozinho02.txt” e faremos uma busca por eles.
    [elder@centos65 Labs]$ touch /media/xfs_lab/arquivozinho01.txt
    [elder@centos65 Labs]$ touch /media/xfs_lab/arquivozinho02.txt

    Fazendo a busca

    [elder@centos65 Labs]$ locate arquivozinho

    Nadica de nada foi encontrado. Isso porque esses arquivos ainda não foram indexados. Vamos atualizar a base de dados.

    [elder@centos65 Labs]$ sudo updatedb

    Refazendo a busca

    [elder@centos65 ~]$ sudo updatedb --prunepaths "/afs /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
    [elder@centos65 ~]$ locate -i arquivozinho
    /media/xfs_lab/arquivozinho01.txt
    /media/xfs_lab/arquivozinho02.txt

    Acima, tive que excluir novamente o caminho “/media” da variável. Para ter algo permanente é melhor excluir  editando o arquivo “/etc/updatedb.conf”

    Usando –add-prunepath

  5. Localizar arquivos que contém “extraido” em seus nomes
    [elder@centos65 ~]$ locate -l 4 extraido
    /home/elder/docs/extraido
    /home/elder/docs/extraido.tar
    /home/elder/docs/extraido/teste.txt
    /home/elder/docs/extraido/teste02.txt
    
  6. Adicionar  “/home/elder/docs” à PRUNEPATH
    [elder@centos65 ~]$ sudo updatedb --add-prunepath "/home/elder/docs"
  7. Refaça a busca
    [elder@centos65 ~]$ locate -l 4 extraido

    Não encontrou nada, porque incluímos  “/home/elder/docs” dentro de PRUNEPATH. Se quiser desfazer basta atualizar a base de dados com
    [elder@centos65 ~]$ sudo updatedb

    Se quiser deixar permanente inclua “/home/elder/docs” editando diretamente o arquivo “/etc/updatedb.conf”

 

Usando updatedb com –prunenames e –add-prunename

 

  1. Localize os 4 primeiros arquivos contendo “extraido” em seus nomes ignorando case(se está em maiúsculo ou minúsculo)
    [elder@centos65 ~]$ locate -il 4 extraido
    /home/elder/docs/extraido
    /home/elder/docs/extraido.tar
    /home/elder/docs/extraido/teste.txt
    /home/elder/docs/extraido/teste02.txt
  2. Insira dentro de PATHNAME o nome da pasta “extraido” e tente localizar novamente
    [elder@centos65 ~]$ sudo updatedb --add-prunename "extraido"
    [elder@centos65 ~]$ locate -l4 extraido
    /home/elder/docs/extraido
    /home/elder/docs/extraido.tar
    /home/elder/docs/extrair02/extraido
    

    Veja que locate achou arquivos com o nome extraido, mas dentro da pasta “docs” e não dentro da pasta “extraido”. prunepath recebe nome de pastas e não de arquivos. Conforme mencionado mais abaixo em vermelho.

  3. Agora encontre com locate todos os arquivos terminados em “.txt” em todo o sistema. Para ser mais sucinto, usarei a opção “-c” apenas para trazer o total.
    [elder@centos65 ~]$ locate -c .txt
    504
    
  4. Agora, vamos incluir  nosso diretório “extraido”.usando –prunenames Exibimos o conteúdo de PRUNENAMES dentro de /etc/updatedb.conf
    [elder@centos65 ~]$ sudo grep "PRUNENAMES" /etc/updatedb.conf 
    PRUNENAMES = ".git .hg .svn"

    Já que –prunenames sobrescreve PRUNENAMES em /etc/updatedb.conf, pegamos o resultado acima e acrescentamos o “extraido”

    [elder@centos65 ~]$ sudo updatedb --prunenames "extraido .git .hg .svn"
  5. Procure por arquivos que contenham .txt

Atualizado: Lendo mais um pouco o manual(man updatedb.conf) do arquivo /etc/updatedb.conf  percebi que valor passado para –prunepaths ou –add-prunepath deve ser o nome de uma pasta/diretório e não de arquivos. Diretórios sem caminhos. Por exemplo, posso passar o nome da pasta “samba” mas não /usr/local/samba.

Então, locate ainda irá encontrar arquivos contendo .txt em seus nomes, porém ignorará qualquer pasta chamada “extraido”. Os arquivos .txt dentro da pasta “extraido” não serão exibidos.

[elder@centos65 ~]$ locate -l4  txt 
/docs/leia.txt.old
/docs/lendo.txt
/docs/texto9.txt
/docs/texto[1,4].txt

Abaixo não foi retornado arquivos contendo .txt que estão dentro da pasta “extraido”

Usando updatedb com –prunefs e –add-prunefs

 

Tenho uma partição do tipo xfs que está montada em /media/xfs_lab

[elder@centos65 docs]$ df -PhT
Filesystem                      Type   Size  Used Avail Use% Mounted on
/dev/sdb1                       xfs    5,0G   33M  5,0G   1% /home/elder/xfs_lab

 

Dentro de /media/xfs_lab estão os seguintes arquivos:

[elder@centos65 docs]$ ls -m /home/elder/xfs_lab/
arquivozinho01.txt, arquivozinho02.txt, meuArquivoXFS, meuArquivoXFS02, meuArquivoXFS02.txt

 

Usando –prunefs

  1. Localizando arquivos contendo em seus nomes “arquivozinho”
    [elder@centos65 docs]$ locate  arquivozinho
    /home/elder/xfs_lab/arquivozinho01.txt
    /home/elder/xfs_lab/arquivozinho02.txt
  2. Adicione o Sistema de Arquivos xfs para ser ignorado nas buscas–prunefs sobrescreve a variável PRUNEFS que está dentro de /etc/updatedb.conf.
    Então antes, pegue o conteúdo já existente dentro de /etc/updatedb.conf

    [elder@centos65 docs]$ grep PRUNEFS /etc/updatedb.conf 
    PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
    

    copie como a baixo e apenas acrescente xfs

    [elder@centos65 docs]$ sudo updatedb --prunefs "xfs 9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
  3. Localize “arquivozinho”
    [elder@centos65 docs]$ locate arquivozinho

    Veja que nada foi retornado.

  4. Use o comando updatedb para voltarmos como estava antes e refaça a pesquisa
    [elder@centos65 docs]$ sudo updatedb
    [elder@centos65 docs]$ locate arquivozinho
    /home/elder/xfs_lab/arquivozinho01.txt
    /home/elder/xfs_lab/arquivozinho02.txt
    

Usando –add-prunefs

  1. Pesquisando por arquivos contendo “meuarquivo”. lembrando de usar -i para que não faça diferença entre maiúsculas e minúsculas.
    [elder@centos65 docs]$ locate -i meuarquivo
    /home/elder/xfs_lab/meuArquivoXFS
    /home/elder/xfs_lab/meuArquivoXFS02
    /home/elder/xfs_lab/meuArquivoXFS02.txt
  2.  Inclua o Sistema de Arquivos xfs para que seja ignorado nas buscas e refaça a busca
    [elder@centos65 docs]$ sudo updatedb --add-prunefs "xfs"
    [elder@centos65 docs]$ locate -i meuarquivo
    

    Nada foi encontrado.

  3. Atualize o banco para resetar o que fizemos.
    [elder@centos65 docs]$ sudo updatedb
  4. Refaçamos a busca
[elder@centos65 docs]$ locate -i meuarquivo
/home/elder/xfs_lab/meuArquivoXFS
/home/elder/xfs_lab/meuArquivoXFS02
/home/elder/xfs_lab/meuArquivoXFS02.txt

Prontinho, arquivos encontrados.

 

Usando updatedb com –prune-bind-mounts

 

Antes de prosseguir veja aqui o que é bind mounts.

 

a opção –prune-bind-mounts recebe apenas dois valores, yes e no(ou 1, 0). ou Seja pode apenas ser habilitado ou desabilitdo.

Tenho já uma pasta montada em outra(binded)

[elder@centos65 ~]$ mount | tail -n1
/disco_bind01/documentos on /disco_bind02/documentos_bind type none (rw,bind)

Tenho os seguintes arquivos dentro de /disco_bind01/documentos/

[elder@centos65 ~]$ ls  /disco_bind01/documentos/
enderecos.txt  lista.txt  nomesSobrenomes.txt  teste_usando_bind.txt

 

  1. Use “updatedb –prune-bind-mounts 0” para que locate não ignore pasta que seja montagem de outra pasta
    [elder@centos65 ~]$ sudo updatedb --prune-bind-mounts 0
    
  2. Localize arquivo que contenha “endereco” em seu nome.
    [elder@centos65 ~]$ locate endereco
    /disco_bind01/documentos/enderecos.txt
    /disco_bind02/documentos_bind/enderecos.txt
  3. Habilite com “[elder@centos65 ~]$ sudo updatedb –prune-bind-mounts 1”  para que locate ignore pasta que seja ponto de montagem de outra pasta.
    [elder@centos65 ~]$ sudo updatedb --prune-bind-mounts 1
  4. Refaça a pesquisa acima e veja que bind mounts não são escaneados
    [elder@centos65 ~]$ locate endereco
    /disco_bind01/documentos/enderecos.txt

 

Conclusão

o comando locate trabalha usando um base de dados que por padrão fica em /var/lib/mlocate/mlocate.db.  Esse banco de dados é gerenciado pelo comando updatedb e um pequeno script em /etc/updatedb.conf que contém apenas algumas variáveis.

Locate é útil por ser uma ferramenta rápida em pesquisas. Muito mais rápida que o comando find. Porém se locate for usado sem está com a a base atualizada poderá trazer arquivos já inexistentes ou não encontrar arquivos recentes.

 

Siga-nos em nossas redes:

Link Facebook: https://www.facebook.com/gnulinuxbr

Link WhatsApp: https://chat.whatsapp.com/G9xS3Ylzoou3TrN49DQso4

Link Telegram: https://t.me/gnulinux_brasil

YouTube: https://www.youtube.com/channel/UCwyFWDqE0v7SwpZenjmzxYQ

 

 

Leitor voraz e um dos administradores do GNU/Linux Brasil no Whatsapp, facebook, youtube e nesse dito site: www.gnulinuxbrasil.com.br

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *