Jak mogę użyć lokalizacji tylko dla katalogu

10

Znajduje dużą liczbę plików znajdujących się w różnych podkatalogach „Dropnot”

$ locate Dropnot

Czy mogę znaleźć tylko lokalizację katalogu locate? (w którym znajduje się katalog „Dropnot”)

Więc jeśli Dropnotjest włączony /home/me/, jest to jedyny zwracany wpis.

Jeśli tak, jaki jest najprostszy / najkrótszy sposób?

Najlepiej przez flagę lub symbol zamiast wypływać i żerować na nim itp., Ale wziąłbym wszystko jako opcję.

Może jakiś Dropnot $ na końcu linii? (ale nie działał).

Michael Durrant
źródło

Odpowiedzi:

5

Nie ma opcji, aby użyć locatewybranego typu pliku (np. Katalogu), ale możesz użyć składni z twojego pytania - Dropnot$aby znaleźć linie, które kończą się Dropnot. W tym celu należy użyć -eopcji lokalizowania, aby włączyć wyrażenie regularne POSIX.

W takim przypadku należy użyć:

locate -e Dropnot$

Ważne jest, jaką wersję lokalizatora posiadasz. W moim systemie (Gentoo Linux) mam Secure Locate:

$ locate --version
Secure Locate 3.1 - Released March 7, 2006

w której nie ma --basenameopcji utherodpowiedzi. Ta opcja jest udostępniana przez GNU Locate z pakietu findutils:

$ ./locate --version
locate (GNU findutils) 4.4.2

Jeśli chcesz użyć wyrażenia regularnego z GNU Locate, powinieneś użyć -rprzełącznika -e.

pbm
źródło
1
nie ma takiej -eopcji only print entries for currently existing files?
phuclv
10

Mam mlocatezainstalowany. Jest to domyślnie rozpowszechniany przez RedHat, więc będzie dostępny na Fedorze, RHEL, CentOS. Odman 1 locate

-b, --basename
       Match  only  the  base  name  against the specified patterns. This 
       is the opposite of --wholename.

Więc jeśli uruchomisz locate -b '\Dropknot', raportuje tylko pliki lub katalogi z dokładnie tym ciągiem.

Because \ is a globbing character, this disables the implicit replacement 
of NAME by *NAME*.
George M.
źródło
locate -b /Dropnotpracował
Michael Durrant
4

Z GNU locate (inne implementacje locate mogą się różnić):

locate '*/Dropnot'
locate Dropnot | grep '/Dropnot$'

Jeśli w argumencie nie ma symbolu wieloznacznego, locateszuka ścieżki o podanym wyszukiwanym haśle jako podłańcuch. Gdy argumentem jest wzór powłoki zawierający co najmniej jeden znak wieloznaczny, locateszuka pełnego dopasowania. Jeśli nie chcesz wypisywać /Dropnotna końcu:

locate -0 '*/Dropnot' | xargs -0 -n1 dirname
locate Dropnot | sed -n 's:/Dropnot$::p'
Gilles „SO- przestań być zły”
źródło
0

Jeśli korzystasz z RedHat, prawdopodobnie masz zainstalowany mlocate, a nie Secure Locate. W takim przypadku nie ma opcji -e i musisz użyć opcji -r lub --regexp, aby wyszukiwać za pomocą podstawowych wyrażeń regularnych.

Jistanidiot
źródło
0

Slackware slocatedomyślnie korzysta z wyszukiwania wyrażeń regularnych z opcją r :

locate -r '/Dropnot$'

wyszuka katalogi o nazwie Dropnot.

To byłoby szukać np ponumerowanych -tylko Dropnotkatalogów (Dropnot1, Dropnot2, etc.):

locate -r '/Dropnot[[:digit:]]\+$'
Skippy le Grand Gourou
źródło
0

Nie wiem, dlaczego nikt nie zaproponował czegoś takiego:

for i in $(locate MYDIR); do [ -d "$i" ] && echo $i; done

To tylko sprawdza, czy którykolwiek z ciągów lokalizujących jest katalogiem i drukuje go

cy8g3n
źródło