Linha de Comando em Linux: Find – Parte 04, Otimizando as Buscas com a Opção -O

Abaixo falaremos sobre Otimização de pesquisas da ferramenta find.

Geralmente não vejo os usuários que usam a ferramenta find fazerem uso dessa opção de otimização. Então, se você for um mero e mortal usuário, assim como eu, talvez não tenha necessidade de usar o material aqui postado. Mas…. se tiver curiosidade essa leitura valerá a pena.

Para prosseguir é importante que vejamos a parte 03 desse artigo.

find [-H] [-L] [-P] [-D debug_opções] [-Onível] [Caminho…] [expressão]

Observação: A seguir usaremos algumas expressões que usam opções que ainda veremos em uma parte futura desse artigo quando falarmos sobre expressões. Uma dessas opções que veremos é -type que procura por tipo, por exemplo, podemos definir -type -f para encontrarmos apenas arquivos e -type d para somente diretórios. temos ainda -type l para links e -type p para pipes. Assim como -type temos -size que busca baseado em tamanho e -name para nomes. Todas essas opções fazem parte de expressões. A parte de expressões ainda será vista.

Descrição de “find -O”

Com “find -O” podemos otimizar de modo que o programa find mude de posição automaticamente alguns termos, assim, deixando mais rápida a sua execução.

“find -O” pode  ter os seguintes níveis 0, 1, 2 e 3:

  • find -O0 = O nível zero é equivalente ao nível 1.
  • find -O1 = o nível um é a otimização padrão ao executarmos find. As buscas baseadas em nomes de arquivos são feitas primeiro. Por exemplo,”find -O1 /home/elder/Labs/ -type f -name “lista*” -size -1G“Acima temos temos os três predicados: -type, -name e -size:
    -type f: Queremos que  a busca seja apenas de arquivos(files), não considere pastas.
    -name “lista*”: Queremos que procure por arquivos que tenham a palavra lista no início de seus nomes.
    -size -1G: Queremos que busque apenas os arquivos que sejam menores que 1 Giga Byte.Considerando os testes acima, com find -O1, -name “lista*” será avaliado primeiro e depois -type f e -size -1G.
  • find -O2 =  Os testes de tipos(-type, xtype) são executados depois dos testes de nomes de arquivos(-name, -iname) e antes dos testes que que requerem informação de inodes. Vamos pegar a mesma estrutura acima e acrescentar -inum:find -O2 /home/elder/Labs/ -size -1G -type f -name “lista*” -inum +1000 -lsAlém dos predicados -size, -type e -name, agora temos também o -inum.
    -inum +1000 trará aquivos com inode maior que mil(+1000). Leia esse link para saber mais sobre o que é inode.Temos o -ls também, mas serve apenas para exibir com mais detalhes os resultados obtidos.Bom, nesse exemplo, om teste -name “lista*” será avaliado primeiro, depois -type f e por último -inum +1000.
  • find -O3 =  Nesse nível de otimização é levado em consideração o que a man page da ferramenta find chama de “Otimizador de Busca Baseado em Custo“.  O custo pode ser barato(testes rápidos)  e caro(testes não rápidos??).
    Uma das coisas que esse  “Otimizador de Busca Baseado em Custo”  leva em consideração é a probabilidade que um teste tem de ser verdadeiro ou de dar certo. Por exemplo, a procura por tipo arquivo(-type f), devido à sua quantidade no sistema, é mais propenso a ser encontrado de que a procura por tipo pipe(-type p). Afinal de contas, arquivos pipe não é tão comum para nós, meros usuários mortais. 🙂 A maioria de nós nem sabe o que é esse tipo de arquivo.

Uma breve explicação para cada nível também já foi publicada na parte 02 deste artigo.

Usando “find -O”  para Otimizar as buscas

Aqui continuamos com mais uma das “opções verdadeiras” do comando find. Lembrando que a man page do comando find chama de opções verdadeiras aquelas que são colocadas antes do caminho.

Da seguinte estrutura veremos [-Onível]

find [-H] [-L] [-P] [-D debug_opções] [-Onível] [Caminho…] [expressão]

aqui, o significado da letra -O é otimização.

 

Para vermos a reordenação ocorrendo deveremos usar a otimização “-O” juntamente com debug “-D tree”

  1. Use otimização nível 1. Procure por arquivos que tenham a palavra “lista” em qualquer parte de seus nomes(-name “*lista*”), Sejam menores que 1 Giga Byte(-size -1G) e sejam to tipo arquivo(-type -f).
    [elder@centos65 ~]$ find -O1 -D tree  /home/elder/Labs/  -size -1G -type f -name "*lista*"
    Predicate List:
    [(] [-size] [-a] [-type] [-a] [-name] [)] [-a] [-print] 
    .............................
    .............................
    .............................
    Optimized command line:
     (  ( -name *lista* [0,8] -a [0,9] [need type] -type f [0,95]  ) -a [0,855] [call stat] -size -1 [0,9]  ) -a [0,684] -print [1] 
    

    Exclui parte do resultado acima para ficar mais claro o entendimento e menos poluída a tela.
    Lembrando que os predicados de adição “-a” e exibição “-print” são exibidos por serem o comportamento padrão e estarem omitidos.

    Usamos a otimização nível 1, na qual os testes que lidam com nomes de arquivos são executados primeiro.

    Temos o seguinte resultado,
    Em  “Predicate List”  temos os predicados na ordem  que os colocamos no comando:  -size, -type e -name
    Em “Optimized command line”  temos os predicados já reordenados/otimizados:  -name, -type, -size

  2. Use otimização nível 2. Procure por arquivos que tenham a palavra “lista” em qualquer parte de seus nomes(-name “*lista*”), Sejam menores que 1 Giga Byte(-size -1G) e sejam to tipo arquivo(-type -f), que tenham o inode maior que 1000(-inum +1000)Novamente irei cortar parte do texto para que foquemos apenas no que nos interessa no momento:
    [elder@centos65 ~]$ find -O2 -D tree  /home/elder/Labs/  -size -1G -type f -name "*lista*"  -inum +1000
    Predicate List:
    [(] [-inum] [-a] [-size] [-a] [-type] [-a] [-name] [)] [-a] [-print] 
    .............................
    .............................
    .............................
    Optimized command line:
    ( ( ( -name *lista* [0,8] -a [0,95] [need type] -type f [0,95] )
    -a [1e-06] [call stat] -size -1 [0,9] ) -a [9e-07] 
    [call stat] [need type] -inum +1000 [1e-06] ) -a [6,84e-07] -print [1] 
    

    Acima usamos o nível 2 de otimização do comando find. Esse nível executa os testes de tipo de arquivos(-type) antes dos testes que  trabalham com informações de inodes. Mas os testes que trabalham com nomes(-name) são sempre executados primeiro.

    Temos o seguinte resultado,
    Em  “Predicate List”  temos os predicados na ordem  que os colocamos no comando:  -inum, -size, -type, -name
    Em “Optimized command line”  temos os predicados já reordenados/otimizados:   -name, -type, -size, -inum

  3. Para finalizarmos, iremos  olhar superficialmente o nível 3. Como dito anteriormente, o nível 3 de otimização trabalha baseado em custos.
    Em alguns casos a probabilidade de algo ter mais chance de acontecer entra em jogo  também. Por exemplo, arquivos (-type f) são mais propensos a serem encontrados de que arquivos do tipo pipe(-type p). Sendo assim, find irá dá prioridade à execução de testes do tipo arquivo(-type f).

    [elder@centos65 ~]$ find -O3 -D tree   /home/elder/Labs/ -type p   -type f
    Predicate List:
    [(] [-type] [-a] [-type] [)] [-a] [-print] 
    .............................
    .............................
    .............................
    Optimized command line:
     ( [need type] -type f [0,95] -a [0,0095] [need type] -type p [0,01]  ) -a [0,0095] -print [1]

    Acima vemos que houve uma reordenação de modo que type -f foi colocado antes de -type p.

Conclusão

Com esse laboratório dá para ter uma noção de como funciona a otimização realizada pela opção -O da ferramenta find.

A próxima parte será sobre Caminhos.

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 *