web-dev-qa-db-fra.com

trouver ou localiser

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?

29
Byte Commander

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.

27
Oli

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 minutes

Prenons 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 seconde

Maintenant, 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éfaut

Il 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.

Mais il n'y a pas d'attributs?

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

Résumé

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.

8
WinEunuuchs2Unix