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
- 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"
- 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"
- 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.
- 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
- 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
- Adicionar “/home/elder/docs” à PRUNEPATH
[elder@centos65 ~]$ sudo updatedb --add-prunepath "/home/elder/docs"
- 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 updatedbSe quiser deixar permanente inclua “/home/elder/docs” editando diretamente o arquivo “/etc/updatedb.conf”
Usando updatedb com prunenames e add-prunename
- 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
- 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.
- 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
- 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"
- 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
- Localizando arquivos contendo em seus nomes “arquivozinho”
[elder@centos65 docs]$ locate arquivozinho /home/elder/xfs_lab/arquivozinho01.txt /home/elder/xfs_lab/arquivozinho02.txt
- Adicione o Sistema de Arquivos xfs para ser ignorado nas buscasprunefs 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"
- Localize “arquivozinho”
[elder@centos65 docs]$ locate arquivozinho
Veja que nada foi retornado.
- 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
- 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
- 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.
- Atualize o banco para resetar o que fizemos.
[elder@centos65 docs]$ sudo updatedb
- 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
- 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
- Localize arquivo que contenha “endereco” em seu nome.
[elder@centos65 ~]$ locate endereco /disco_bind01/documentos/enderecos.txt /disco_bind02/documentos_bind/enderecos.txt
- 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
- 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
One Comment to “Linha de Comando em Linux: locate e updatedb – parte 03”