web-dev-qa-db-fra.com

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

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!

44
Tim

UPDATE: remarque sur l'utilisation de l'option de regex de Locate par rapport au shell extension de nom de fichier par rapport aux arguments de localisation ...

Shell FILENAME EXPANSION
Lorsque vous tapez locate /bin/b* (notez qu'il n'y a pas de guillemets), plusieurs événements se produisent.

  1. Tout d'abord, expansion du nom de fichier du shell étendra le caractère spécial caractère du shell shell * (car le * n'est pas protégé, c'est-à-dire qu'il n'y a pas de "guillemets doubles")
  2. Cette extension résultante est une liste de noms de fichiers . ce qui est peut-être très long ... Cette liste est passée à locate sous forme d'arguments individuels en ligne de commande.
  3. locate teste ensuite chacun de ces arguments contre chacun des fichiers de sa base de données et génère les 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 fichier qualifiés dans sa base de données.
Cela signifie qu'il correspondra à la fois à /bin/bash et à /home/user/bin/brackets
Vous avez un certain degré de contrôle de cette façon, mais recherchez recherche regex offre plus; comme le font d'autres options de localisation.

LOCATE'S REGEX OPTION
Lorsque vous tapez locate -r "/bin/b.*", il se produit autre chose que des arguments simples. (Shell-expand-args ne sont qu'une liste d'arguments simples)

  1. L'option -r indique à localiser de traiter votre argument comme un motif d'expression régulière.
  2. Les guillemets protègent le * depuis l'extension du nom de fichier du shell. Cela signifie que le * et le point. are now caractères spéciaux regex
  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 fichiers commençant par /bin/b ... eg2. locate -r ~/"bin/b.*" produit des noms de fichier commençant par /home/utilisateur/bin/b .. Notez que le ~/est pas protégé par des "guillemets" et est donc soumis à Shell tilde-expansion qui convertit ~/en/home/utilisateur /

Résumé: "L'expansion du nom de fichier du 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* est Shell-globbing) ...

De info localise: -r, --regex

  • "... Les correspondances (regex) sont effectuées sur le nom de chemin complet. Ainsi, par défaut, un chemin est attribué si une partie 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 ou à la fin d'un chemin. "

note: -i = ignorer la casse
. . . . . -r = regex
. . . . . ~/sera étendu par le shell à/home/user (lorsque ~/n'est pas entre guillemets)
. . . . . '\' (barre oblique + espace; pas de guillemets) est un espace littéral (pour éviter le développement 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 recherche dans tout votre répertoire personnel la présence de "La Bella Vita" n'importe où.

Vous pouvez également limiter la recherche au nom de fichier mais en utilisant le -b ou le --basename .. auquel cas le début de la ligne regex ^ s'applique à seulement le nom de base ...

Je me retrouve le plus souvent avec locate -bir

PS .. Locate est si rapide, que j’ai jamais utilisé find ... ni ai-je utilisé la recherche en nautile (trop lente)

Avec 'localiser', si vous recherchez quelque chose qui vient d'être ajouté, lancez simplement Sudo updatedb pour actualiser la base de données de Locate ... (mais si vous l'avez récemment ajoutée, vous savez probablement où elle se trouve:) ....

25
Peter.O

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.

13
Adam Byrtek

Vous pouvez utiliser locate /rootpath/*filenamespec. Je ne l'avais pas essayé auparavant, mais cela semble fonctionner. Pour faire votre exemple, ce serait locate /home/tim/science/*math*

Vous voudrez peut-être examiner la commande findplutô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. Pas aussi rapide 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.

8
Nerdfest

Pour moi le plus pratique est

cd /home/tim/science
locate math | grep `pwd`
0
alex440