Utilisation de Locate pour rechercher un répertoire

20

J'utilise Locate tout le temps pour trouver des fichiers dont je connais le nom, Locate est très rapide et j'adore ça. Pour les fichiers récemment créés, la recherche est excellente, normalement avec les fichiers récemment créés, je sais où ils ont été créés, donc je n'ai pas à rechercher tout mon système de fichiers.

Quand j'ai oublié l'emplacement d'un répertoire, ni trouver ni localiser ne semble idéal.

Locate recrache toujours beaucoup trop d'informations car chaque fichier d'un répertoire correspond également à Locate. Par exemple, si je cherchais un répertoire nommé log quelque part sur mon système de fichiers, le journal de localisation retournerait des tonnes et des tonnes de résultats. Si je fais la même chose avec find, find / -name log -type d find prend quelques minutes à s'exécuter et crache toutes sortes d'erreurs d'autorisation chaque fois qu'il rencontre un dossier qu'il ne peut pas lire.

Y a-t-il une meilleure façon?

Réponse: Je m'en tiens donc à grep jusqu'à ce que je trouve autre chose:

locatedir () {
    for last; do true; done
    if [[ $last == *\/* ]]
    then
        locate $@ | grep "${last}\$"
    else
        locate $@ | grep "/${last}\$"
    fi
}
Michael
la source

Réponses:

12

Une façon (je pense qu'il peut y avoir une meilleure façon) est d'utiliser grep pour ne renvoyer que les chemins qui se terminent par le nom de votre dossier:

locate foldername | grep /foldername$
misterben
la source
28

Vous pouvez utiliser l'option --regex( -r) de locate:

locate -r '/log$'
Florian Diesch
la source
Oui (+1). locatea sa propre capacité de regex intégrée: -rou --regex... pour une gamme complète d'options voir: info localiser
Peter.O
1
Je savais qu'il devait y avoir une meilleure façon!
misterben
Si court et ça marche bien. Grande contribution! Une autre raison d'apprendre / maîtriser les expressions régulières
loves.by.Jesus
Vous n'avez pas besoin des deux 'dans ce cas: locate -r /log$c'est suffisant.
simlev
5

As-tu essayé:

locate /home/insertusernamehere/*/filename?

ou

locate file | grep -i '^/home/.*/examplesubdirectory'?

ou toute variation de ce genre?

RolandiXor
la source
Cette réponse montre que ce grepn'est pas nécessaire, et comme le montre la première option suggérée, les regexps ne le sont pas non plus.
Tom
2

C'est ici

locatedir () {
    locate "$*" | while read line
    do 
    if [ -d "$line" ] ; then echo $line ; fi
    done
}

locatedir $*
Linuxuser
la source
1
Si vous pouvez expliquer quels changements vous avez apportés, cela sera utile pour d'autres aussi.
Ron