Comment puis-je utiliser la localisation uniquement pour un répertoire

10

Cela trouve un grand nombre de fichiers qui se trouvent dans divers sous-répertoires de "Dropnot"

$ locate Dropnot

Puis-je trouver uniquement l'emplacement du répertoire avec locate? (dans quel répertoire "Dropnot" se trouve)

Donc, si Dropnotest dans /home/me/, c'est la seule entrée qui est retournée.

Si oui, quel est le moyen le plus simple / le plus court?

De préférence à travers un drapeau ou un symbole plutôt que de le canaliser et de le chercher, etc., mais je prendrais n'importe quoi en option.

Peut-être une sorte de Dropnot $ pour la fin de la ligne? (mais n'a pas fonctionné).

Michael Durrant
la source

Réponses:

5

Il n'y a pas d'option à utiliser locatepour trouver le type de fichier sélectionné (comme le répertoire), mais vous pouvez utiliser la syntaxe de votre question - Dropnot$pour trouver les lignes qui se terminent par Dropnot. Pour cela, vous devez utiliser l' -eoption pour localiser pour activer l'expression régulière POSIX.

Dans ce cas, vous devez utiliser:

locate -e Dropnot$

Il est important de savoir quelle version de Locate vous avez. Dans mon système (Gentoo Linux), j'ai Secure Locate:

$ locate --version
Secure Locate 3.1 - Released March 7, 2006

dans laquelle il n'y a pas d ' --basenameoption dans utherla réponse de. Cette option est fournie par GNU Locate à partir du paquet findutils:

$ ./locate --version
locate (GNU findutils) 4.4.2

Si vous souhaitez utiliser regexp avec GNU Locate, vous devez utiliser -rplutôt switch -e.

pbm
la source
1
n'est pas l' -eoption only print entries for currently existing files?
phuclv
10

J'ai mlocateinstallé. C'est la distribution par défaut de RedHat, donc ce sera sur Fedora, RHEL, CentOS. Deman 1 locate

-b, --basename
       Match  only  the  base  name  against the specified patterns. This 
       is the opposite of --wholename.

Donc, si vous exécutez locate -b '\Dropknot', il ne rapportera que les fichiers ou répertoires avec exactement cette chaîne.

Because \ is a globbing character, this disables the implicit replacement 
of NAME by *NAME*.
George M
la source
locate -b /Dropnottravaillé
Michael Durrant
4

Avec GNU Locate (les autres implémentations de Locate peuvent différer):

locate '*/Dropnot'
locate Dropnot | grep '/Dropnot$'

Lorsqu'il n'y a pas de caractère générique dans l'argument, locaterecherche un chemin d'accès ayant le terme de recherche spécifié comme sous-chaîne. Lorsque l'argument est un modèle de shell contenant un ou plusieurs caractères génériques, locaterecherche une correspondance complète. Si vous ne voulez pas sortir le /Dropnotà la fin:

locate -0 '*/Dropnot' | xargs -0 -n1 dirname
locate Dropnot | sed -n 's:/Dropnot$::p'
Gilles 'SO- arrête d'être méchant'
la source
0

Si vous êtes sur RedHat, vous avez probablement installé mlocate et non Secure Locate. Dans ce cas, il n'y a pas d'option -e et vous devez utiliser -r ou --regexp pour effectuer une recherche à l'aide d'expressions régulières de base.

Jistanidiot
la source
0

Slackware utilise slocatepar défaut, qui a une recherche regex avec option r :

locate -r '/Dropnot$'

recherchera les répertoires nommés Dropnot.

Ceci recherche par exemple pour les numéros -Seulement Dropnotrépertoires (Dropnot1, Dropnot2, etc.):

locate -r '/Dropnot[[:digit:]]\+$'
Skippy le Grand Gourou
la source
0

Je ne sais pas pourquoi personne n'a proposé quelque chose comme ça:

for i in $(locate MYDIR); do [ -d "$i" ] && echo $i; done

Cela vérifie simplement si l'une des chaînes de localisation est un répertoire et l'imprime

cy8g3n
la source