Utilisez "localiser" sous un répertoire spécifique?

46

Je me demandais comment limiter la plage de recherche de "localiser" à un répertoire?

Par exemple, comment trouver des fichiers / répertoires avec la chaîne "maths" dans leurs noms sous un répertoire "/ home / tim / science /"?

Merci et salutations!

Tim
la source

Réponses:

30

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.

  1. 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")
  2. Cette extension résultante est une liste de noms de fichiers . ce qui est peut-être très long ... Cette liste est transmise à locateautant d'arguments de ligne de commande individuels.
  3. 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)

  1. L' -roption indique à Locate de traiter votre argument comme un motif d'expression régulière.
  2. 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
  3. 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\ regexou-/"my regex"

par exemple. locate -ir ~/".*"la\ bella\ vitaest 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 -bou --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 .. Locateest 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 updatedbpour actualiser la base de données de localiser ... (mais si vous l'avez récemment ajoutée, vous savez probablement où elle se trouve:) ....

Peter.O
la source
13

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.

Adam Byrtek
la source
@Adam .. Ne sous-estimez pas votre méthode; c'est tout à fait correct, mais vous pouvez utiliser le propre regex de Locate au lieu de piping pour grep .. La méthode "other" à laquelle vous faites référence n'utilise pas regex et se comporte très différemment .... J'ai ajouté quelques détails sur les différences entre mes réponse ...
Peter.O
2
localiser moins | grep ^ / bin est beaucoup plus rapide que localise -r ^ / bin /.* moins, parce que localiser moins effectuera une recherche efficace du mot less less, et que localisera -r effectuera une opération regex sur toutes les entrées de locatedb
Marcel Valdez Orozco
@MarcelValdezOrozco Qu'est-ce que la "recherche efficace du mot" et pourquoi est-ce plus rapide que l'expression régulière?
Flashrunner
@Flashrunner Parce locatequ'une O(log(n))recherche est terminée locatedblorsque vous lui donnez une requête de recherche non regex, vous pouvez utiliser grepla 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.
Marcel Valdez Orozco
@MarcelValdezOrozco Mais pourquoi la recherche non regex sur db est-elle 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?
Flashrunner
8

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 findcommande plutôt que locatepour 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.

Nerdfest
la source
C’est la meilleure réponse car elle s’utilise elle- locatemê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).
Tom
Celui-ci fonctionne vraiment comme un charme que vous pouvez utiliser pour localiser des fichiers dans un répertoire spécifique Path, grâce @Nerdfest
amit_game
1

Pour moi le plus pratique est

cd /home/tim/science
locate math | grep `pwd`
alex440
la source
Avez-vous vraiment lu la question?
Tessaracter