Verwenden Sie locate, um ein Verzeichnis zu finden

20

Ich benutze locate die ganze Zeit, um Dateien zu finden, deren Namen ich kenne. Locate ist sehr schnell und ich liebe das. Für kürzlich erstellte Dateien ist find großartig. Normalerweise weiß ich bei kürzlich erstellten Dateien, wo sie erstellt wurden, damit ich nicht mein gesamtes Dateisystem durchsuchen muss.

Wenn ich den Ort eines Verzeichnisses vergessen habe, scheinen jedoch weder Finden noch Lokalisieren ideal.

Locate gibt immer viel zu viele Informationen aus, da jede Datei in einem Verzeichnis auch mit locate übereinstimmt. Wenn ich zum Beispiel irgendwo in meinem Dateisystem nach einem Verzeichnis namens log suchte , würde locate log Tonnen und Tonnen von Ergebnissen zurückgeben. Wenn ich dasselbe mit find mache , dauert find / -name log -type d find Minuten und spuckt jedes Mal alle möglichen Berechtigungsfehler aus, wenn es auf einen Ordner stößt, den es nicht lesen kann.

Gibt es einen besseren Weg?

Antwort: Also bleibe ich bei grep, bis ich etwas anderes finde:

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

Antworten:

12

Ein Weg (ich vermute, dass es einen besseren Weg gibt) ist, grep zu verwenden, um nur die Pfade zurückzugeben, die in Ihrem Ordnernamen enden:

locate foldername | grep /foldername$
Herrben
quelle
28

Sie können die Option --regex( -r) verwenden von locate:

locate -r '/log$'
Florian Diesch
quelle
Ja (+1) locatehat seine eigene eingebaute Regex-Fähigkeit: -roder --regex... für alle Optionen siehe: info locate
Peter.O
1
Ich wusste, dass es einen besseren Weg geben muss!
Misterben
So kurz und es funktioniert reibungslos. Toller Beitrag! Ein weiterer Grund, reguläre Ausdrücke
loved.by.Jesus
Sie brauchen die beiden 'in diesem Fall nicht: locate -r /log$ist genug.
Simlev
5

Hast du es versucht:

locate /home/insertusernamehere/*/filename?

oder

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

oder eine Variation davon?

RolandiXor
quelle
Diese Antwort zeigt, dass dies grepnicht erforderlich ist, und wie in der ersten vorgeschlagenen Option gezeigt, handelt es sich auch nicht um reguläre Ausdrücke.
Tom
2

Hier ist es

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

locatedir $*
Linuxuser
quelle
1
Wenn Sie erklären können, welche Änderungen Sie vorgenommen haben, ist dies auch für andere hilfreich.
Ron