Il existe les commandes find
et locate
pour rechercher des fichiers sur le disque.
Je sais que find
traite récursivement tous les sous-répertoires nécessaires à la recherche dans les fichiers et est donc lent, mais à jour, alors que locate
utilise une base de données mise à jour de temps en temps (quand exactement?) Pour afficher rapidement des résultats parfois obsolètes.
Y-a-t'il d'autres différences? Dans quelles situations préféreriez-vous l'un ou l'autre? Et quand la base de données locate
est-elle mise à jour généralement?
locate
n'est vraiment utile que pour rechercher des fichiers et les afficher à des humains. Vous pouvez faire plusieurs choses avec, mais je n’aurais pas assez confiance en elle pour analyser et, comme vous le dites, il est impossible de garantir l’état de la base de données interne, d’autant plus qu’elle n’est programmée que depuis /etc/cron.daily/mlocate
, une fois par jour. !
find
est en direct. Il filtre, exclut, exécute. Il convient à l'analyse. Il peut sortir des chemins relatifs. Il peut sortir des chemins complets. Il peut faire des choses en fonction d'attributs, pas seulement de noms.
locate
a certainement une place dans ma boîte à outils, mais il s’agit généralement du bas à la dernière tentative de trouver quelque chose. C'est aussi plus facile que find
.
Même si j'aime bien Oli (ce qui est beaucoup!), Je ne suis pas d'accord avec lui sur la commande find
. Je n'aime pas ça.
find
commande prend plus de trois minutesPrenons par exemple cette commande simple:
$ 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
Cela prend trois minutes à find
pour tout rechercher à partir de /
. Par défaut, de nombreux messages d'erreur apparaissent et vous devez effectuer une recherche pour trouver ce que vous recherchez. Néanmoins, il vaut mieux que grep
cherche dans le lecteur entier une chaîne qui prend 53 heures : `grep`ing tous les fichiers pour une chaîne prend beaucoup de temps
Je sais que je peux manipuler les paramètres de la commande find pour améliorer son fonctionnement, mais le point ici est le temps nécessaire à son exécution.
locate
commande prend moins d'une secondeMaintenant, utilisons locate
:
$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target
real 0m0.816s
user 0m0.792s
sys 0m0.024s
La commande Locate prend moins d'une seconde!
updatedb
ne s'exécute qu'une fois par jour par défautIl est vrai que la commande updatedb
qui met à jour la base de données de localisation n'est exécutée qu'une fois par jour par défaut. Vous pouvez l'exécuter manuellement avant de rechercher les fichiers que vous venez d'ajouter en utilisant:
$ time Sudo updatedb
real 0m3.460s
user 0m0.503s
sys 0m1.167s
Bien que cela prenne 3 secondes, il est petit comparé aux 3 minutes et plus de la commande find
.
J'ai mis à jour mon Sudo crontab -e
afin d'inclure la ligne en bas:
# m h dom mon dow command
0 0 1 * * /bin/journalctl --vacuum-size=200M
*/5 * * * * /usr/bin/updatedb
Désormais, toutes les cinq minutes, updatedb
est exécuté et locate
base de données de commandes est presque toujours à jour.
Vous pouvez diriger la sortie de locate
vers d'autres commandes. Si, par exemple, vous voulez les attributs de fichier, vous pouvez utiliser:
$ 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: -
J'ai posté cette réponse pour montrer la rapidité et la facilité d'utilisation de locate
. J'ai essayé de remédier à certaines des lacunes des commandes signalées par d'autres.
La commande find
doit parcourir l'intégralité de la structure de répertoires pour rechercher des fichiers. La commande locate
a sa propre base de données, ce qui lui donne une vitesse de l'éclair en comparaison.