localizar vs. localizar

29

Existem os comandos find e locate para procurar arquivos no disco.

Eu sei que find recursivamente processa todos os subdiretórios necessários para pesquisar arquivos e, portanto, é lento, mas atualizado, enquanto locate usa um banco de dados que é atualizado de vez em quando (quando exatamente?) para mostrar rapidamente resultados que podem estar desatualizados embora.

Existem outras diferenças? Em quais situações preferiria um ou outro? E quando o banco de dados locate é atualizado normalmente?

    
por Byte Commander 08.09.2015 / 15:49

2 respostas

26

locate é realmente bom apenas para localizar arquivos e exibi-los para seres humanos. Você pode fazer algumas coisas com ele, mas eu não confiaria o suficiente para analisar e - como você diz - é impossível garantir o estado do banco de dados interno, mais ainda porque ele está agendado para ser executado a partir de /etc/cron.daily/mlocate , uma vez um dia!

find está ativo. Filtra, exclui, executa. É adequado para análise. Pode enviar caminhos relativos. Pode produzir caminhos completos. Pode fazer coisas com base em atributos, não apenas nomes.

locate certamente tem um lugar na minha caixa de ferramentas, mas geralmente fica na parte inferior como um último esforço para encontrar algo. É mais fácil do que find também.

    
por Oli 08.09.2015 / 16:15
8

Por mais que eu goste de Oli (o que é muito!), eu discordo dele no comando find . Eu não gosto disso.

O comando find leva mais de três minutos

Tome por exemplo este comando simples:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

São necessários três minutos para find para pesquisar tudo a partir de / . Por padrão, resmas de mensagens de erro aparecem e você deve procurá-las para encontrar o que está procurando. Ainda assim, é melhor que grep procurar em toda a unidade uma string que leve 53 horas : 'grep'ing todos os arquivos para uma string leva um longo tempo

Eu sei que posso mexer nos parâmetros do comando find para que ele funcione melhor, mas o ponto aqui é quanto tempo leva para ser executado.

O comando locate leva menos de um segundo

Agora vamos usar locate :

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

O comando locate leva menos de um segundo!

updatedb só é executado uma vez por dia por padrão

É verdade que o comando updatedb , que atualiza o locate database , é executado apenas uma vez por dia, por padrão. Você pode executá-lo manualmente antes de procurar por arquivos adicionados:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

Embora isso leve 3 segundos, é pequeno em comparação com os 3 + minutos do comando find .

Atualizei meu sudo crontab -e para incluir a linha na parte inferior:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

Agora, a cada cinco minutos, updatedb é executado e o banco de dados de comandos locate está quase sempre atualizado.

Mas não há atributos?

Você pode canalizar locate output para outros comandos. Se, por exemplo, você deseja os atributos de arquivo que você pode usar:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

Resumo

Eu postei esta resposta para mostrar a velocidade e a facilidade de uso de locate . Eu tentei abordar algumas das falhas de comando apontadas por outros.

O comando find precisa percorrer toda a estrutura de diretórios para localizar arquivos. O comando locate tem seu próprio banco de dados, que oferece uma velocidade impressionante em comparação.

    
por WinEunuuchs2Unix 01.04.2018 / 01:28

Tags