trova vs. trova


30

Ci sono i comandi finde locateper cercare i file sul disco.

So che findelabora in modo ricorsivo tutte le sottodirectory necessarie per cercare i file e quindi è lenta ma aggiornata, mentre locateutilizza un database che viene aggiornato ogni tanto (quando esattamente?) Per mostrare rapidamente risultati che potrebbero essere obsoleti.

Ci sono altre differenze? In quali situazioni uno preferirebbe l'uno o l'altro? E quando locateviene aggiornato il database di solito?



1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "updateb di solito viene eseguito quotidianamente da cron (8) per aggiornare il database predefinito."
Rinzwind,

@Rinzwind La risposta U&L collegata è fantastica, è un peccato non poter duplicare su più siti. Ma sai di più sul cronjob, quando verrà eseguito esattamente? Dopo l'avvio? In un momento specifico (penso di aver letto 1-2AM o qualcosa del genere) solo? Cosa succede se viene chiuso in quel momento? Si avvia quando il computer è inattivo? Come posso vedere l'età del database?
Byte Commander

2
@ByteCommander - Ecco a cosa anacronserve. Non so se è installato di default su sistemi desktop / server, ma è su notebook. Funziona all'avvio e vede se alcuni lavori cron dovrebbero essere eseguiti mentre il sistema era spento e li esegue. È davvero utile, ma può causare alcuni problemi se hai lavori programmati lontano da mezzanotte. Che può causare il lavoro da eseguire sul caricamento del sistema e poi di nuovo quando arriva il momento - forse molto meno di 24 ore più tardi (per un lavoro quotidiano.)
Joe

@Joe Quindi funzionerà durante l'avvio e lo rallenterà, o funzionerà un po 'di tempo dopo l'avvio, o di solito funziona con una priorità così bassa che funziona solo quando il sistema è quasi inattivo?
Byte Commander

Risposte:


27

locateè davvero buono solo per trovare file e mostrarli agli umani. Puoi fare alcune cose con esso, ma non mi fiderei abbastanza per analizzare e - come dici tu - è impossibile garantire lo stato del database interno, tanto più perché è programmato per essere eseguito da /etc/cron.daily/mlocate, una volta al giorno!

findè in diretta. Filtra, esclude, esegue. È adatto per l'analisi. Può generare percorsi relativi. Può generare percorsi completi. Può fare le cose in base agli attributi, non solo ai nomi.

locatecertamente ha un posto nella mia cassetta degli attrezzi, ma di solito è proprio in fondo come uno sforzo disperato per trovare qualcosa. È anche più facile di findcosì.


2
Trovo locateche sia molto più veloce se voglio cercare nel mio intero filesystem. E puoi aggiornare manualmente il database usando updatedbprima di usarlo.
hytromo,

Sai come viene configurato esattamente quel cronjob? Funziona in un momento specifico o quando il sistema è inattivo o n minuti dopo l'avvio? Perché penso di aver letto da qualche parte che è programmato alle 1-2 del mattino, quando la mia macchina è di solito spenta. Non verrà mai aggiornato, tranne manualmente ( sudo updatedb)? E c'è la possibilità di vedere quanti anni ha il database?
Byte Commander

grep run-parts /etc/crontabVedrai che questi vengono gestiti attraverso anacron(che vedrai attraverso man anacronè più resistente ai sistemi che non sono sempre attivi). Da quello che posso vedere, invece, dovrebbe avviarlo all'avvio se si perde il cron time originale.
Oli

2
Trovo che Locate non indicizzi le mie partizioni rimovibili / non montate, quindi se voglio trovare qualcosa su di esse, devo usare find. Naturalmente, individuare non ha tutte le incredibili opzioni che trova, come -exec command {} \;eseguire un comando su ogni file trovato. Mi piace usare locate -bquali restrizioni individuare per trovare i file che corrispondono sul componente finale del nome, senza il resto del percorso. Lo provo spesso prima perché è così veloce. Inoltre, è possibile eseguire sudo updatedbogni volta che si desidera aggiornare il database di individuazione.
Joe,

se hai bisogno di una ricerca in tempo reale che sia anche un po 'semplice, puoi usare qualcosa comels -R | grep 'file_name.txt'
jena,

9

Per quanto mi piaccia Oli (che è molto!) Non sono d'accordo con lui sul findcomando. Non mi piace

find il comando impiega più di tre minuti

Prendi ad esempio questo semplice comando:

$ 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

Ci vogliono più di tre minuti per findcercare tutto a partire da /. Per impostazione predefinita, vengono visualizzati messaggi di errore e devi cercarli per trovare quello che stai cercando. Comunque è meglio che grepcercare una stringa nell'intero disco che impiega 53 ore : `grep`ing tutti i file per una stringa richiede molto tempo

So di poter giocherellare con i parametri del comando find per farlo funzionare meglio, ma il punto qui è la quantità di tempo necessaria per l'esecuzione.

locate il comando richiede meno di un secondo

Ora usiamo locate:

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

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

Il comando Locate richiede meno di un secondo!

updatedb eseguito solo una volta al giorno per impostazione predefinita

È vero che il updatedbcomando che aggiorna il database di individuazione viene eseguito solo una volta al giorno per impostazione predefinita. Puoi eseguirlo manualmente prima di cercare i file appena aggiunti usando:

$ time sudo updatedb

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

Anche se ciò richiederà 3 secondi, è piccolo rispetto ai find3+ minuti del comando.

Ho aggiornato il mio sudo crontab -eper includere la riga in fondo:

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

Ora updatedbviene eseguito ogni cinque minuti e il locatedatabase dei comandi è quasi sempre aggiornato.

Ma non ci sono attributi?

È possibile reindirizzare l' locateoutput ad altri comandi. Se ad esempio vuoi gli attributi del file puoi usare:

$ 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: -

Sommario

Ho pubblicato questa risposta per mostrare la velocità e la facilità d'uso di locate. Ho provato ad affrontare alcune delle mancanze di comando segnalate da altri.

Il findcomando deve attraversare l'intera struttura di directory per trovare i file. Il locatecomando ha un proprio database che gli dà la velocità della luce in confronto.


@EliahKagan Ma il comando find stava scorrendo e elencando tutte le directory e i file su tutte le unità e le partizioni. Sembrava funzionare e alla fine mi aspettavo una stampa ... In entrambi i casi non si trattava di "correggere" la ricerca del comando find, ma di ottenere il tempo. L'esecuzione locate / display-auto-brightnessrichiede 17 secondi e visualizza anche ogni directory e file su tutti i dischi.
WinEunuuchs2Unix

@EliahKagan ho capito. --regexera necessario perché c'erano troppi risultati restituiti con la mia stringa di ricerca. Troverò due nuovi esempi per trovare, localizzare e aggiornare la mia risposta in pochi minuti.
WinEunuuchs2Unix

1
Per chiarire il punto di Eliah, quel findcomando significa "stampare i nomi dei file di tutti i file nelle directory /e display-auto-brightness". Penso che intendevi usare find / -name display-auto-brightness, ma anche quello stampa molti errori "Autorizzazione negata".
wjandrea,

@wjandrea Sì, come ho detto, il punto non era trovare il file, ma era il momento di trovare il comando find. Sto eseguendo nuovamente i test ora con parametri validi dopo aver svuotato le cache. Quindi aggiornerò la risposta.
WinEunuuchs2Unix

1
@Win No, il tuo esempio è ancora valido e non credo che il tempo di elaborazione sia cambiato molto se il file viene trovato o meno.
wjandrea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.