Réponses:
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.
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)
-r
option indique à Locate de traiter votre argument comme un motif d'expression régulière. 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
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:) ....
Dirigez-le vers grep, comme ceci
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Edit: L'autre réponse est meilleure, je ne savais pas que vous pouvez transmettre un motif à localiser.
locate
qu'une O(log(n))
recherche est terminée locatedb
lorsque vous lui donnez une requête de recherche non regex, vous pouvez utiliser grep
la regex pour effectuer une O(m)
recherche sur les sous-résultats déjà réduits. (n = nombre total d'entrées dans locatedb
[c.-à-d. tous les fichiers de votre lecteur], m = nombre d'entrées correspondant moins à votre locatedb
), complexité totale en cours d'exécution:, O(log(n)) + O(m)
où m est en moyenne log(n)
, donc vous obtenez 2*O(log(n))
, par opposition à O(n)
quand vous effectuez une requête regex sur toutes les entrées de locatedb
.
O(log(n))
alors que la recherche regex est O(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 que locate
pour ce type de comportement. La syntaxe serait find rootforsearch -name filenamepattern -print
. Dans ce cas, votre exemple nécessiterait find /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.
locate
même (ne nécessitant aucun autre utilitaire tel que grep
) et ne contient pas d’expression rationnelle (ce qui est bien, mais inutile dans ce cas).
Pour moi le plus pratique est
cd /home/tim/science
locate math | grep `pwd`