UPDATE : Une note sur l'utilisation de l' option regex de Locate par rapport à l' extension de nom de fichier du shell par rapport aux arguments de Locate ...
EXPANSION DE NOM DE FICHIER DE SHELL
Lorsque vous tapez locate /bin/b*
(notez qu'il n'y a pas de guillemets), plusieurs événements se produisent.
- Tout d’abord, l’ extension du nom de fichier du shell étendra le caractère spécial du motif du shell * (car le * n’est pas protégé, c’est-à-dire qu’il n’ya pas de "guillemets")
- Cette extension résultante est une liste de noms de fichiers . ce qui est peut-être très long ... Cette liste est transmise à
locate
autant d'arguments de ligne de commande individuels.
locate
puis teste chacun de ces arguments contre chacun des fichiers de sa base de données et génère des correspondances.
Notez cependant que 'localiser' n'a aucun concept du répertoire de travail actuel. Il ne fait que comparer vos arguments avec les noms de fichiers qualifiés complets dans sa base de données.
Cela signifie que cela va correspondre aux deux /bin/bash
et que /home/user/bin/brackets
vous avez un certain degré de contrôle de cette façon, mais que la recherche de regex de location en offre plus; comme le font d'autres options de localisation.
OPTION DE LOCATE'S REGEX
Lorsque vous tapez locate -r "/bin/b.*"
des choses différentes, cela se produit avec des arguments simples .. ( shell-expand-arguments sont juste une liste d'arguments simples)
- L'
-r
option indique à Locate de traiter votre argument comme un motif d'expression régulière.
- Les guillemets protègent le * du développement du nom de fichier shell. Cela signifie que le * et le point. sont maintenant des caractères regex spéciaux
- En tant que regex, vous pouvez facilement dire à 'localiser' qu'il corresponde à l'entrée de la base de données de différentes manières: par exemple, 1.
locate -r "^/bin/b.*"
produit des noms de fichier commençant par / bin / b ... eg2. locate -r ~/"bin/b.*"
produit des noms de fichier commençant par / home / user / bin / b .. Notez que le ~ / n'est pas protégé par des "guillemets" et qu'il est donc soumis au développement de tilde shell qui convertit ~ / en / home / user /
Résumé: "l'expansion du nom de fichier shell" est assez différente de "regex"
Revenons maintenant au message d'origine:
locate
liste généralement toute la base de données sur stdout, donc pour la limiter à un répertoire particulier, vous devez la filtrer ... Vous pouvez le faire via les options de localisation.
Vous pouvez utiliser la capacité regex de Locate plutôt que de simplement shell-globbing ... ( locate /dir/myfile*
c'est shell-globbing) ...
De informations recherchez : -r
,--regex
- "... Les correspondances (regex) sont effectuées sur le nom de chemin complet. Ainsi, par défaut, un chemin d'accès est associé si une partie quelconque de celle-ci correspond à l'expression régulière spécifiée. L'expression régulière peut utiliser ^ ou $ pour ancrer une correspondance au début. début ou fin d'un chemin. "
note: -i = ignorer la casse
. . . . . -r = regex
. . . . . ~ / sera étendu par le shell à / home / user (lorsque ~ / n'est pas entre guillemets)
. . . . . '\' (baskslash + space; pas de guillemets) est un espace littéral (pour éviter l'expansion du shell). Vous pouvez mettre la chaîne entre guillemets, mais veillez à laisser le ~ / en dehors des guillemets: ~/my\ regex
ou-/"my regex"
par exemple. locate -ir ~/".*"la\ bella\ vita
est identique à locate -ir ~/".*la bella vita"
et cherchera dans tout votre répertoire personnel "La Bella Vita" n'importe où.
Vous pouvez aussi limiter la recherche au nom de fichier mais en utilisant -b
ou --basename
.. auquel cas la début de ligne de regex ^
s’applique uniquement au nom de base ...
Je me retrouve le plus souvent en utilisant locate -bir
PS .. Locate
est si rapide, que je n'ai jamais utilisé find
... ni utilisé la recherche de nautile (trop lent)
Avec 'localiser', si vous recherchez quelque chose qui vient d'être ajouté, lancez simplement sudo updatedb
pour actualiser la base de données de localiser ... (mais si vous l'avez récemment ajoutée, vous savez probablement où elle se trouve:) ....
locate
qu'uneO(log(n))
recherche est terminéelocatedb
lorsque vous lui donnez une requête de recherche non regex, vous pouvez utilisergrep
la regex pour effectuer uneO(m)
recherche sur les sous-résultats déjà réduits. (n = nombre total d'entrées danslocatedb
[c.-à-d. tous les fichiers de votre lecteur], m = nombre d'entrées correspondant moins à votrelocatedb
), complexité totale en cours d'exécution:,O(log(n)) + O(m)
où m est en moyennelog(n)
, donc vous obtenez2*O(log(n))
, par opposition àO(n)
quand vous effectuez une requête regex sur toutes les entrées delocatedb
.O(log(n))
alors que la recherche regex estO(n)
? Le nombre d'entrées dans la base de données est le même dans chaque cas. Je suppose que c'est un algorithme de recherche?Vous pouvez utiliser
locate /rootpath/*filenamespec
.Je n’avais pas essayé auparavant, mais cela semble fonctionner. Pour faire votre exemple, ce seraitlocate /home/tim/science/*math*
Vous voudrez peut-être examiner la
find
commande plutôt quelocate
pour ce type de comportement. La syntaxe seraitfind rootforsearch -name filenamepattern -print
. Dans ce cas, votre exemple nécessiteraitfind /home/tim/science -name *math* -print
.Non aussi vite que localiser car il n'y a pas de base de données à rechercher ... il recherche en fait le système de fichiers. Vous pouvez également utiliser de nombreuses options autres que l'impression, si vous souhaitez réellement utiliser le fichier.la source
locate
même (ne nécessitant aucun autre utilitaire tel quegrep
) et ne contient pas d’expression rationnelle (ce qui est bien, mais inutile dans ce cas).Pour moi le plus pratique est
la source