Za pomocą locate znajdź katalog


20

Cały czas używam funkcji lokalizowania, aby znaleźć pliki, których nazwę znam, lokalizacja jest bardzo szybka i uwielbiam to. Znalezienie ostatnio utworzonych plików jest świetne, zwykle z ostatnio utworzonymi plikami wiem, gdzie w zasadzie zostały utworzone, więc nie muszę przeszukiwać całego systemu plików.

Kiedy zapomniałem lokalizacji katalogu, ani znalezienie, ani lokalizacja nie wydają się idealne.

Lokalizowanie zawsze wyrzuca zbyt dużo informacji, ponieważ każdy plik w katalogu również pasuje do lokalizacji. Na przykład, jeśli szukałem katalogu o nazwie log gdzieś w moim systemie plików, zlokalizowanie dziennika zwróciłoby mnóstwo wyników. Jeśli zrobię to samo z find, find / -name log -type d find potrzebuje minut, aby uruchomić i wyrzuca różnego rodzaju błędy uprawnień za każdym razem, gdy napotka folder, którego nie może odczytać.

Czy jest lepszy sposób?

Odpowiedź: Więc trzymam się grep, dopóki nie znajdę czegoś innego:

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

Odpowiedzi:


12

Sposobem (podejrzewam, że może być lepszy sposób) jest użycie grep, aby zwrócić tylko te ścieżki, które kończą się nazwą twojego folderu:

locate foldername | grep /foldername$

28

Możesz użyć opcji --regex( -r) locate:

locate -r '/log$'

Tak (+1). locatema własną wbudowaną funkcję wyrażeń regularnych: -rlub --regex... pełny zakres opcji znajduje się w: info locate
Peter.O

1
Wiedziałem, że musi być lepszy sposób!
misterben

Tak krótki i działa płynnie. Świetny wkład! Kolejny powód do nauki / opanowania wyrażeń regularnych
loved.by.Jesus

W tym przypadku nie potrzebujesz dwóch ': locate -r /log$wystarczy.
simlev

5

Czy próbowałeś:

locate /home/insertusernamehere/*/filename?

lub

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

czy jakaś odmiana tego?


Ta odpowiedź pokazuje, że grepnie jest to konieczne i jak widać w pierwszej sugerowanej opcji, nie są też wyrażenia regularne.
Tom

2

Oto jest

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

locatedir $*

1
Jeśli potrafisz wyjaśnić, jakie zmiany wprowadziłeś, będzie to pomocne również dla innych.
Ron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.