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
}
Michael
źródło

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$
misterben
źródło
28

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

locate -r '/log$'
Florian Diesch
źródło
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?

RolandiXor
źródło
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 $*
Linuxuser
źródło
1
Jeśli potrafisz wyjaśnić, jakie zmiany wprowadziłeś, będzie to pomocne również dla innych.
Ron