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.