encontrar vs. localizar

30

Existem os comandos finde locatepara procurar arquivos no disco.

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

Há outras diferenças lá? Em quais situações um prefere um ou outro? E quando o locatebanco de dados é atualizado normalmente?

Byte Commander
fonte
7
Referência: unix.stackexchange.com/questions/60205/…
Rinzwind 8/15
11
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "updatedb é normalmente executado diariamente pelo cron (8) para atualizar o banco de dados padrão."
Rinzwind 8/09/2015
@Rinzwind A resposta U&L vinculada é incrível, é uma pena que não possamos fazer duplicatas entre sites. Mas você sabe mais sobre o cronjob, quando exatamente ele será executado? Após a inicialização? Apenas em um horário específico (acho que li 1 ou 2 da manhã) ou algo assim? O que acontece se for desligado nesse momento? Ele inicia quando o computador está ocioso? Como posso ver a idade do banco de dados?
Byte Commander
2
@ByteCommander - É para isso que anacronserve. Não sei se ele está instalado por padrão em sistemas / servidores de desktop, mas está em notebooks. Ele é executado durante a inicialização e verifica se alguma tarefa cron deve ter sido executada enquanto o sistema estava desligado e as executa. É realmente útil, mas pode causar alguns problemas se você tiver trabalhos agendados longe da meia-noite. Isso pode fazer com que o trabalho a ser executado na inicialização e, em seguida, novamente quando o tempo vem-se - possivelmente muito menos do que 24 horas depois (para um trabalho diário.)
Joe
@ Joe Então, ele será executado durante a inicialização e o tornará mais lento, ou será executado algum tempo após a inicialização, ou geralmente será executado com uma prioridade tão baixa que apenas será executado quando o sistema estiver quase ocioso?
Byte Commander

Respostas:

27

locateé realmente bom apenas para encontrar arquivos e exibi-los para 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á programado para ser executado apenas /etc/cron.daily/mlocateuma vez por dia!

findestá vivo. Filtra, exclui, executa. É adequado para análise. Pode gerar caminhos relativos. Pode gerar caminhos completos. Pode fazer coisas com base em atributos, não apenas em nomes.

locatecertamente tem um lugar na minha caixa de ferramentas, mas geralmente é bem embaixo como um último esforço para encontrar algo. É mais fácil do que findtambém.

Oli
fonte
2
Acho locateque é muito mais rápido se eu quiser pesquisar em todo o meu sistema de arquivos. E você pode atualizar manualmente o banco de dados usando updatedbantes de usá-lo.
hytromo 8/09/2015
Você sabe como esse cronjob está exatamente configurado? Ele é executado em um horário específico ou quando o sistema está ocioso ou n minutos após a inicialização? Porque acho que li em algum lugar que está agendado para as 1-2 da manhã, quando minha máquina geralmente está desligada. Ele nunca será atualizado, exceto manualmente ( sudo updatedb)? E há uma chance de ver quantos anos o banco de dados tem?
Byte Commander
grep run-parts /etc/crontabVocê verá que eles estão sendo gerenciados anacron(o que você verá man anacroné mais resistente a sistemas que não estão ativos o tempo todo). Pelo que posso ver, deve executá-lo na inicialização, se você perder o horário cron original.
Oli
2
Acho que o localize não indexa minhas partições removíveis / desmontadas; portanto, se eu quiser encontrar algo nelas, tenho que usar o localizador. Obviamente, a localização não tem todas as opções surpreendentes que encontramos - como -exec command {} \;executar um comando em todos os arquivos encontrados. Eu gosto de usar o locate -bque restringe a localização para encontrar arquivos que correspondam ao componente final do nome - sem o restante do caminho. Costumo experimentar isso primeiro porque é muito rápido. Além disso, você pode executar a sudo updatedbqualquer momento que desejar atualizar o banco de dados de localização.
Joe
se você precisar de busca em tempo real que também é um pouco mais fácil, você pode usar algo comols -R | grep 'file_name.txt'
Jena
8

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

find comando leva mais de três minutos

Tomemos, 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

Demora mais de três minutos para findpesquisar tudo a partir de /. Por padrão, resmas de mensagens de erro são exibidas e você deve procurá-las para encontrar o que está procurando. Ainda assim, é melhor do grepque procurar em toda a unidade uma string que leva 53 horas : `grep`ing todos os arquivos de uma string leva muito tempo

Eu sei que posso mexer nos parâmetros do comando find para fazê-lo funcionar melhor, mas o ponto aqui é a quantidade de tempo que leva para executar.

locate comando 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 localizar leva menos de um segundo!

updatedb executar apenas uma vez por dia por padrão

É verdade que o updatedbcomando que atualiza o banco de dados de localização é executado apenas uma vez por dia, por padrão. Você pode executá-lo manualmente antes de procurar arquivos adicionados recentemente usando:

$ time sudo updatedb

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

Embora isso leve três segundos, é pequeno em comparação aos find3 ou mais minutos do comando.

Atualizei meu sudo crontab -epara 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 locatebanco de dados de comandos está quase sempre atualizado.

Mas não há atributos?

Você pode canalizar a locatesaída para outros comandos. Se, por exemplo, você deseja os atributos do arquivo, 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: -

Sumário

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

O findcomando precisa percorrer toda a estrutura de diretórios para encontrar arquivos. O locatecomando possui seu próprio banco de dados, o que lhe confere a velocidade da luz em comparação.

WinEunuuchs2Unix
fonte
@EliahKagan Mas o comando find estava percorrendo e listando todos os diretórios e arquivos em todas as unidades e partições. Parecia estar funcionando e eu esperava uma impressão no final ... De qualquer forma, não se tratava de "consertar" a pesquisa do comando find, mas sim de obter tempo. A execução locate / display-auto-brightnessleva 17 segundos e também exibe todos os diretórios e arquivos em todos os discos.
WinEunuuchs2Unix 31/03
@EliahKagan eu entendo. --regexfoi necessário porque houve muitos resultados retornados com minha string de pesquisa. Encontrarei dois novos exemplos para encontrar, localizar e atualizar minha resposta em alguns minutos.
WinEunuuchs2Unix 31/03
11
Para esclarecer o argumento de Eliah, esse findcomando significa "imprimir os nomes de arquivos de todos os arquivos nos diretórios /e display-auto-brightness". Eu acho que você pretendia usar find / -name display-auto-brightness, mas mesmo isso imprime muitos erros indesejados "Permissão negada".
wjandrea
@wjandrea Sim, como eu disse, o ponto não era encontrar o arquivo, era hora de encontrar o comando. Estou reexecutando testes agora com parâmetros válidos após a liberação de caches. Então eu vou atualizar a resposta.
WinEunuuchs2Unix
11
@ Win Não, seu exemplo ainda é válido e não acho que o tempo de processamento seja alterado muito, independentemente de o arquivo ser encontrado ou não.
Wjandrea