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
}

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$

28

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

locate -r '/log$'

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?


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 $*

1
Wenn Sie erklären können, welche Änderungen Sie vorgenommen haben, ist dies auch für andere hilfreich.
Ron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.