Per quanto mi piaccia Oli (che è molto!) Non sono d'accordo con lui sul find
comando. 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 find
cercare tutto a partire da /
. Per impostazione predefinita, vengono visualizzati messaggi di errore e devi cercarli per trovare quello che stai cercando. Comunque è meglio che grep
cercare 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 updatedb
comando 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 find
3+ minuti del comando.
Ho aggiornato il mio sudo crontab -e
per includere la riga in fondo:
# m h dom mon dow command
0 0 1 * * /bin/journalctl --vacuum-size=200M
*/5 * * * * /usr/bin/updatedb
Ora updatedb
viene eseguito ogni cinque minuti e il locate
database dei comandi è quasi sempre aggiornato.
Ma non ci sono attributi?
È possibile reindirizzare l' locate
output 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 find
comando deve attraversare l'intera struttura di directory per trovare i file. Il locate
comando ha un proprio database che gli dà la velocità della luce in confronto.