trouver vs localiser

30

Il y a les commandes findet locatepour rechercher des fichiers sur le disque.

Je sais que findtraite récursivement tous les sous-répertoires nécessaires pour rechercher des fichiers et est donc lent mais à jour, alors qu'il locateutilise une base de données qui est mise à jour de temps en temps (quand exactement?) Pour afficher rapidement des résultats qui pourraient être obsolètes cependant.

Y-a-t'il d'autres différences? Dans quelles situations préférerait-on l'un ou l'autre? Et quand la locatebase de données est-elle mise à jour habituellement?

Byte Commander
la source
1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html " updatedb est généralement exécuté quotidiennement par cron (8) pour mettre à jour la base de données par défaut."
Rinzwind du
@Rinzwind La réponse U&L liée est géniale, c'est dommage que nous ne puissions pas faire de doublons intersites. Mais en savez-vous plus sur le cronjob, quand cela se déroulera-t-il exactement? Après le démarrage? À un moment précis (je pense avoir lu 1-2 heures ou quelque chose comme ça) seulement? Que se passe-t-il s'il est fermé à ce moment-là? Cela démarre-t-il lorsque l'ordinateur est inactif? Comment puis-je voir l'âge de la base de données?
Byte Commander
2
@ByteCommander - C'est pour ça anacron. Je ne sais pas s'il est installé par défaut sur les systèmes / serveurs de bureau, mais c'est sur les ordinateurs portables. Il s'exécute au démarrage et voit si des tâches cron auraient dû s'exécuter alors que le système était hors tension et les exécute. C'est vraiment utile, mais cela peut causer des problèmes si vous avez des tâches planifiées loin de minuit. Cela peut entraîner l'exécution du travail au démarrage, puis à nouveau lorsque le moment est venu - peut-être beaucoup moins de 24 heures plus tard (pour un travail quotidien.)
Joe
@Joe Alors, fonctionnera-t-il pendant le démarrage et le ralentira-t-il, ou s'exécutera-t-il un certain temps après le démarrage, ou s'exécute-t-il généralement avec une priorité si faible qu'il ne s'exécute que lorsque le système est presque inactif?
Byte Commander

Réponses:

27

locateest vraiment seulement bon pour trouver des fichiers et les afficher aux humains. Vous pouvez faire quelques choses avec, mais je ne lui ferais pas assez confiance 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 ne doit s'exécuter /etc/cron.daily/mlocatequ'une fois par jour!

findest en direct. Il filtre, exclut, exécute. Il convient pour l'analyse. Il peut générer des chemins relatifs. Il peut sortir des chemins complets. Il peut faire des choses basées sur des attributs, pas seulement sur des noms.

locatea certainement une place dans ma boîte à outils, mais c'est généralement juste en bas comme un dernier effort pour trouver quelque chose. C'est plus facile que findtrop.

Oli
la source
2
Je trouve que locatec'est beaucoup plus rapide si je veux rechercher tout mon système de fichiers. Et vous pouvez mettre à jour manuellement la base de données updatedbavant de l'utiliser.
hytromo
Vous savez comment ce cronjob est exactement configuré? Exécute-t-il à une heure spécifique ou lorsque le système est inactif ou n minutes après le démarrage? Parce que je pense avoir lu quelque part qu'il est prévu à 1-2 heures, lorsque ma machine est généralement éteinte. Ne sera-t-il donc jamais mis à jour, sauf manuellement ( sudo updatedb)? Et est-il possible de voir l'âge de la base de données?
Byte Commander
grep run-parts /etc/crontabVous verrez que ceux-ci sont gérés par le biais anacron(ce que vous verrez à travers man anacronest plus résistant aux systèmes qui ne sont pas tout le temps). D'après ce que je peux voir, il devrait l'exécuter au démarrage à la place si vous manquez l'heure de cron d'origine.
Oli
2
Je trouve que Locate n'indexe pas mes partitions amovibles / non montées, donc si je veux trouver quelque chose dessus, je dois utiliser find. Bien sûr, Locate n'a pas toutes les options incroyables de find does - comme -exec command {} \;pour exécuter une commande sur chaque fichier trouvé. J'aime utiliser locate -bce qui limite la localisation à la recherche de fichiers correspondant au dernier composant du nom - sans le reste du chemin. J'essaye souvent ça d'abord parce que c'est tellement rapide. Vous pouvez également exécuter à sudo updatedbtout moment pour actualiser la base de données de localisation.
Joe
si vous avez besoin d'une recherche en temps réel qui est également un peu facile, vous pouvez utiliser quelque chose commels -R | grep 'file_name.txt'
jena
9

Autant j'aime Oli (ce qui est beaucoup!) Je suis en désaccord avec lui sur la findcommande. Je n'aime pas ça.

find la commande prend plus de trois minutes

Prenons par exemple cette simple commande:

$ 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

Il faut plus de trois minutes pour findtout rechercher à partir de /. Par défaut, des tonnes de messages d'erreur apparaissent et vous devez les parcourir pour trouver ce que vous recherchez. Il vaut quand même mieux que grepde rechercher dans le lecteur entier une chaîne qui prend 53 heures : `grep`s tous les fichiers pour une chaîne prend beaucoup de temps

Je sais que je peux jouer avec les paramètres de la commande find pour la faire fonctionner mieux, mais le point ici est le temps qu'il faut pour s'exécuter.

locate la commande prend moins d'une seconde

Utilisons maintenant 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 de localisation prend moins d'une seconde!

updatedb ne fonctionne qu'une fois par jour par défaut

Il est vrai que la updatedbcommande 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, c'est petit par rapport aux find3+ minutes de la commande.

J'ai mis sudo crontab -eà jour mon pour inclure la ligne en bas:

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

Maintenant, toutes les cinq minutes updatedbsont exécutées et la locatebase de données de commandes est presque toujours à jour.

Mais il n'y a pas d'attributs?

Vous pouvez diriger la locatesortie 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: -

Sommaire

J'ai posté cette réponse pour montrer la vitesse et la facilité d'utilisation de locate. J'ai essayé de corriger certains des défauts de commande signalés par d'autres.

La findcommande doit parcourir toute la structure de répertoires pour rechercher des fichiers. La locatecommande possède sa propre base de données qui lui donne une vitesse de l'éclair en comparaison.

WinEunuuchs2Unix
la source
@EliahKagan Mais la commande find faisait défiler et listait tous les répertoires et fichiers sur tous les lecteurs et partitions. Cela semblait fonctionner et je m'attendais à une impression à la fin ... Quoi qu'il en soit, il ne s'agissait pas de "corriger" la recherche de la commande find, c'était d'obtenir l'heure. L'exécution locate / display-auto-brightnessprend 17 secondes et affiche également chaque répertoire et fichier sur tous les disques.
WinEunuuchs2Unix
@EliahKagan Je comprends. --regexétait nécessaire car trop de résultats ont été renvoyés avec ma chaîne de recherche. Je vais trouver deux nouveaux exemples pour trouver et localiser et mettre à jour ma réponse dans quelques minutes.
WinEunuuchs2Unix
1
Pour clarifier le point d'Eliah, cette findcommande signifie "imprimer les noms de fichiers de tous les fichiers dans les répertoires /et display-auto-brightness." Je pense que vous vouliez l'utiliser find / -name display-auto-brightness, mais même cela imprime beaucoup d'erreurs indésirables "Autorisation refusée".
wjandrea
@wjandrea Oui, comme je l'ai dit, il ne s'agissait pas de trouver le fichier, c'était de chronométrer la commande find. Je suis en train de relancer des tests avec des paramètres valides après avoir vidé les caches. Ensuite, je mettrai à jour la réponse.
WinEunuuchs2Unix
1
@ Win Non, votre exemple est toujours valide, et je ne pense pas que le temps de traitement ait beaucoup changé, que le fichier soit trouvé ou non.
wjandrea