Dans les systèmes Linux et Unix, il existe deux commandes de recherche courantes: locate
et find
.
Quels sont les avantages et les inconvénients de chacun? Quand l'un a des avantages sur l'autre?
locate(1)
n'a qu'un seul gros avantage sur find(1)
: la vitesse.
find(1)
, cependant, a de nombreux avantages par rapport à locate(1)
:
find(1)
est primordiale, pour revenir à la toute première version d'AT & T Unix . Vous le trouverez même dans les Linux embarqués réduits via Busybox . C'est tout sauf universel.
locate(1)
est beaucoup plus jeune que find(1)
. L'ancêtre le plus ancien de locate(1)
n'est apparu qu'en 198 , et il n'était pas largement disponible en tant que "locate
" jusqu'en 1994, date à laquelle il a été adopté - dans GNU findutils et dans 4.4BSD .
locate(1)
est également non standard , il n'est donc pas installé par défaut partout. Certains systèmes d'exploitation de type POSIX ne la proposent même pas en option, et là où elle est disponible, l'implémentation peut manquer des fonctionnalités souhaitées car il n'y a pas de norme indépendante spécifiant le jeu de fonctionnalités minimum qui doit être disponible.
Il existe une norme de facto , étant BSD locate(1)
, mais ce n'est que parce que les deux autres les principales versions de locate
implémentent toutes ses options: -0
, -c
, -d
, -i
, -l
, -m
, -s
Et -S
. mlocate
implémente 6 options supplémentaires qui ne sont pas dans BSD locate
: -b
, -e
, -P
, -q
, --regex
Et -w
. GNU locate
implémente ces six plus un autre quatre : -A
, -D
, -E
Et -p
. (J'ignore les alias et les différences mineures comme -?
Vs -h
Vs --help
.)
Les BSD et Mac OS X livrent BSD locate
.
La plupart des Linux sont livrés GNU locate
, mais Red Hat Linux et Arch sont livrés à la place mlocate
. Debian n'installe pas non plus dans son installation de base, mais propose les deux versions dans ses référentiels de packages par défaut; si les deux sont installés en même temps, "locate
" exécute mlocate
.
Oracle expédie mlocate
dans Solaris depuis le 11.2 , publié en décembre 2014. Auparavant, locate
n'était pas installé par défaut sur Solaris. (Vraisemblablement, cela a été fait pour réduire l'incompatibilité des commandes de Solaris avec Oracle Linux , qui est basé sur Red Hat Enterprise Linux , qui utilise également mlocate
.)
IBM AIX ne fournit toujours aucune version de locate
, au moins à partir d'AIX 7.2 , sauf si vous installez GNU = findutils
dans AIX Toolbox for Linux Applications .
HP-UX également apparaît pour manquer locate
dans le système de base.
Les anciens "vrais" Unix n'incluaient généralement pas d'implémentation de locate
.
find(1)
possède une syntaxe d'expression puissante, avec de nombreuses fonctions, opérateurs booléens , etc.
find(1)
peut sélectionner des fichiers avec plus qu'un simple nom. Il peut sélectionner par:
Lors de la recherche de fichiers par nom, vous pouvez effectuer une recherche à l'aide de syntaxe de globalisation de fichier dans toutes les versions de find(1)
, ou dans GNU ou BSD, en utilisant - expressions régulières .
Les versions actuelles de locate(1)
acceptent les modèles globaux comme le fait find
, mais BSD locate
ne fait pas du tout de regex. Si vous êtes comme moi et devez utiliser une variété de types de machines, vous préférez le filtrage grep
au développement d'une dépendance à -r
Ou --regex
.
locate
a besoin d'un filtrage plus fort que find
parce que ...
find(1)
ne recherche pas nécessairement tout le système de fichiers. Vous le pointez généralement vers un sous-répertoire, un parent contenant tous les fichiers sur lesquels vous souhaitez qu'il opère. Le comportement typique d'une implémentation locate(1)
est de vomir tous les fichiers correspondant à votre modèle, le laissant au filtrage grep
et ainsi de réduire son éruption à sa taille.
(Astuce maléfique: locate /
Vous obtiendra probablement une liste de tous les fichiers du système!)
Il existe des variantes de locate(1)
comme slocate(1)
qui limitent la sortie en fonction des autorisations utilisateur, mais ce n'est pas la version par défaut de locate
dans n'importe quel système d'exploitation majeur.
find(1)
peut faire des choses aux fichiers qu'il trouve, en plus de simplement les trouver. L'opérateur le plus puissant et le plus largement supporté est -exec
, Mais il y en a d'autres. Dans les récentes implémentations GNU et BSD find, par exemple, vous avez les opérateurs -delete
Et -execdir
.
find(1)
s'exécute en temps réel, donc sa sortie est toujours à jour.
Étant donné que locate(1)
repose sur une base de données mise à jour des heures ou des jours dans le passé, sa sortie peut être obsolète. (C'est le problème de cache périmé .) Cette pièce a deux faces:
locate
peut nommer des fichiers qui n'existent plus.
GNU locate
et mlocate
ont le drapeau -e
Pour lui faire vérifier l'existence du fichier avant d'imprimer le nom de chaque fichier qu'il a découvert dans le passé, mais cela ronge certains l'avantage de vitesse locate
, et n'est pas disponible dans BSD locate
en plus.
locate
ne nommera pas les fichiers créés depuis la dernière mise à jour de la base de données.
Vous apprenez à vous méfier quelque peu de la sortie de locate
, sachant que cela peut être faux.
Il existe des moyens de résoudre ce problème, mais je ne connais aucune implémentation largement utilisée. Par exemple, il y a rlocate
, mais il apparaît pour ne fonctionner contre aucun noyau Linux moderne.
find(1)
n'a jamais plus de privilèges que l'utilisateur qui l'exécute.
Étant donné que locate
fournit un service global à tous les utilisateurs d'un système, il souhaite que son processus updatedb
s'exécute en tant que root
pour pouvoir voir l'intégralité du système de fichiers. Cela conduit à un choix de problèmes de sécurité:
Exécutez updatedb
en tant que root, mais rendez son fichier de sortie lisible dans le monde pour que locate
puisse s'exécuter sans privilèges spéciaux. Cela expose efficacement les noms de tous les fichiers du système à tous les utilisateurs. Cela peut suffire à une faille de sécurité pour causer un vrai problème.
BSD locate
est configuré de cette façon sur Mac OS X et FreeBSD.
Écrivez la base de données comme lisible uniquement par root
et créez locate
setuid
root pour qu'il puisse lire la base de données. Cela signifie que locate
doit effectivement réimplémenter le système d'autorisation du système d'exploitation afin qu'il ne vous montre pas les fichiers que vous ne pouvez pas normalement voir. Cela augmente également la surface d'attaque de votre système, en risquant spécifiquement une attaque escalade racine .
Créez un utilisateur ou un groupe spécial "locate
" pour posséder le fichier de base de données et marquez le binaire locate
comme setuid/setgid
Pour cet utilisateur/groupe afin qu'il puisse lire la base de données. Cela n'empêche pas en soi les attaques par escalade de privilèges, mais il atténue considérablement les dommages que l'on pourrait causer.
mlocate
est configuré de cette façon sur Red Hat Enterprise Linux .
Cependant, vous avez toujours un problème, car si vous pouvez utiliser un débogueur sur locate
ou le faire dump core vous pouvez accéder à des parties privilégiées de la base de données.
Je ne vois pas de moyen de créer une commande locate
vraiment "sécurisée", à moins de l'exécuter séparément pour chaque utilisateur du système, ce qui annule une grande partie de son avantage sur find(1)
.
En bout de ligne, les deux sont très utiles. locate(1)
est préférable lorsque vous essayez simplement de trouver un fichier particulier par son nom, dont vous savez qu'il existe, mais vous ne vous souvenez simplement pas où il se trouve exactement. find(1)
est préférable lorsque vous avez une zone ciblée à examiner ou lorsque vous avez besoin de l'un de ses nombreux avantages.
locate
utilise une base de données prédéfinie, qui doit être régulièrement mise à jour, tandis que find
parcourt un système de fichiers pour localiser les fichiers.
Ainsi, locate
est beaucoup plus rapide que find
, mais peut être inexact si la base de données - peut être vue comme un cache - n'est pas mise à jour (voir la commande updatedb
).
De plus, find
peut offrir plus de granularité, car vous pouvez filtrer les fichiers par chaque attribut de celui-ci, tandis que locate
utilise un modèle correspondant aux noms de fichiers.
find
n'est pas possible pour un novice ou un utilisateur occasionnel d'Unix d'utiliser avec succès sans lire attentivement la page de manuel. Historiquement, certaines versions de find
n'avaient même pas par défaut le -print
option, ajoutant à l'hostilité de l'utilisateur.
locate
est moins flexible, mais beaucoup plus intuitif à utiliser dans le cas courant.
Un léger inconvénient de Locate est qu'il peut ne pas indexer la zone du système de fichiers qui vous intéresse. Sur les systèmes de bureau Debian, par exemple Linux Mint 17.2, le fichier /etc/updatedb.conf est configuré pour exclure certaines zones de la considération , y compris/tmp,/var/spool et /home/.ecryptfs.
Ignorer /home/.ecryptfs empêche les noms de fichiers dans les répertoires chiffrés d'être exposés à des utilisateurs non autorisés. Cependant, si votre répertoire personnel est crypté avec ecryptfs, cela signifie également que votre répertoire personnel n'est pas indexé, et Locate ne trouvera donc jamais rien dans votre répertoire personnel. Cela pourrait le rendre largement inutile pour vous (c'est le cas pour moi). En plus de ne pas trouver de résultats, le processus updatedb chargera périodiquement votre disque sans aucun avantage, et pourrait tout aussi bien être désactivé si vous êtes le principal ou le seul utilisateur du système.