Użyć „zlokalizuj” w określonym katalogu?

46

Zastanawiałem się, jak ograniczyć zakres wyszukiwania „lokalizować” do jakiegoś katalogu?

Na przykład, jak znaleźć pliki / katalogi z ciągiem „matematyka” w ich nazwach w katalogu „/ home / tim / science /”?

Dziękuję i pozdrawiam!

Tim
źródło

Odpowiedzi:

30

AKTUALIZACJA : Uwaga na temat używania opcji wyrażenia regularnego locate w porównaniu do rozszerzenia nazwy pliku powłoki w stosunku do argumentów locate ...

ROZSZERZENIE NAZWY NAZWY PLIKU
Kiedy piszeszlocate /bin/b* (pamiętaj, że nie ma cudzysłowów), dzieje się kilka rzeczy.

  1. Po pierwsze, rozszerzenie nazwy pliku powłoki spowoduje rozwinięcie specjalnego wzorca powłoki * (Dzieje się tak, ponieważ * nie jest chroniony, tzn. Nie ma „podwójnych cudzysłowów”)
  2. Wynikowe rozszerzenie to lista nazw plików . co może być bardzo długie ... Ta lista jest przekazywana do locatewielu pojedynczych argumentów wiersza poleceń.
  3. locate następnie testuje każdy z tych argumentów względem każdego z plików w bazie danych i dopasowuje dane wyjściowe.

Należy jednak pamiętać, że „locate” nie ma pojęcia o bieżącym katalogu roboczym. Dopasowuje tylko argumenty do w pełni kwalifikowanych nazw plików w swojej bazie danych.
Oznacza to, że będzie pasować do obu /bin/bash i /home/user/bin/brackets
masz w ten sposób pewien stopień kontroli, ale wyszukiwanie wyrażeń regularnych w locate oferuje więcej; podobnie jak inne opcje lokalizacji.

OPCJE REGEKCJI LOKALIZACJI
Po wpisaniu locate -r "/bin/b.*"różnych rzeczy dzieje się inaczej niż w przypadku zwykłych argumentów .. ( Argumenty z rozszerzoną powłoką to tylko lista prostych argumentów)

  1. Ta -ropcja każe locate traktować argument jako wzorzec regularny.
  2. Znaki cudzysłowu chronią * przed rozszerzeniem nazwy pliku powłoki. Oznacza to, że * i kropka. są teraz specjalnymi znakami regularnymi
  3. Będąc wyrażeniem regularnym, możesz bardzo łatwo powiedzieć „lokalizować”, aby pasowało do wpisu bazy danych na różne sposoby: np. 1. locate -r "^/bin/b.*"tworzy nazwy plików zaczynające się od / bin / b ... eg2. locate -r ~/"bin/b.*"tworzy nazwy plików zaczynające się od / home / user / bin / b .. Zauważ, że ~ / nie jest chroniony przez „cudzysłów” i dlatego podlega rozszerzeniu tyldy, które konwertuje ~ / do / home / user /

Podsumowanie: „interpretacja nazwy pliku powłoki” jest zupełnie inna niż „regex”

Teraz wróć do oryginalnego postu:


locate zwykle wyświetla całą bazę danych na standardowe wyjście, więc aby ograniczyć ją do określonego katalogu, musisz ją przefiltrować ... Możesz to zrobić za pomocą opcji lokalizowania.

Możesz użyć możliwości wyrażenia regularnego locate, zamiast tylko globowania powłoki ... ( locate /dir/myfile* to globowanie powłoki) ...

Z informacji zlokalizować : -r,--regex

  • „... (wyrażenia regularne) są wykonywane względem całej nazwy ścieżki, więc domyślnie nazwa ścieżki zostanie dopasowana, jeśli jakakolwiek jej część pasuje do określonego wyrażenia regularnego. Wyrażenie regularne może używać ^ lub $ do zakotwiczenia dopasowania w początek lub koniec nazwy ścieżki. ”

Uwaga: -i = ignoruj ​​wielkość liter
. . . . . -r = regex
. . . . . ~ / zostanie rozwinięte przez powłokę do / home / user (gdy ~ / nie jest w cudzysłowach)
. . . . . „\” (baskslash + spacja; bez cudzysłowów) to dosłowna spacja (aby uniknąć rozszerzenia powłoki). Możesz wpisać ciąg w cudzysłów, ale pamiętaj, aby ~ / poza cudzysłowami: ~/my\ regexlub-/"my regex"

na przykład. locate -ir ~/".*"la\ bella\ vitajest taki sam locate -ir ~/".*la bella vita"i przeszuka cały katalog domowy w poszukiwaniu „La Bella Vita” występującego w dowolnym miejscu.

Możesz także ograniczyć wyszukiwanie tylko do nazwy pliku, ale używając -blub --basename.., w którym to przypadku wyrażenie regularne ^odnosi się tylko do nazwy basename ...

Najczęściej używam locate -bir

PS .. Locatejest tak szybki, że nigdy nie użyłem find... ani nie użyłem wyszukiwania nautilusa (zbyt wolno)

W przypadku „locate”, jeśli szukasz czegoś, co jest nowo dodane, po prostu uruchom, sudo updatedbaby odświeżyć bazę danych locate ... (ale jeśli niedawno ją dodałeś, prawdopodobnie wiesz, gdzie to jest:) ....

Peter.O
źródło
13

Przeprowadź go przez grep, w ten sposób

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

Edycja: druga odpowiedź jest lepsza, nie wiedziałem, że możesz przekazać wzór do zlokalizowania.

Adam Byrtek
źródło
@Adam .. Nie lekceważ swojej metody; jest całkiem w porządku, ale możesz użyć własnego wyrażenia regularnego zamiast pipowania do grep .. Metoda „inna”, do której się odwołujesz, nie używa wyrażenia regularnego i zachowuje się zupełnie inaczej… Dodałem trochę szczegółów na temat różnic w mojej odpowiedź ...
Peter.O
2
zlokalizuj mniej | grep ^ / bin jest znacznie szybszy niż locate -r ^ / bin /.* less, ponieważ locate less wykona skuteczne wyszukiwanie słowa less, a locate -r wykona operację wyrażenia regularnego na wszystkich wpisach w locb
Marcel Valdez Orozco
@MarcelValdezOrozco Co to jest „skuteczne wyszukiwanie słowa” i dlaczego jest szybsze niż regex?
Flashrunner
@Flashrunner Ponieważ locaterobi to O(log(n))szukanie nad locatedbkiedy dasz mu zakaz regex zapytania, a następnie można użyć grep„s regex aby przeprowadzić O(m)przeszukiwanie nad już obniżonych cząstkowych wynikach. (n = całkowita liczba wpisów w locatedb[tj. wszystkich plikach na twoim dysku], m = liczba wpisów, które pasują mniej do twojego locatedb), całkowita złożoność działania:, O(log(n)) + O(m)gdzie m jest średnio log(n), więc dostajesz 2*O(log(n)), w przeciwieństwie do O(n)kiedy wykonujesz zapytanie regularne dla wszystkich pozycji w locatedb.
Marcel Valdez Orozco
@MarcelValdezOrozco Ale dlaczego wyszukiwanie poza wyrażeniem regularnym w bazie danych jest O(log(n))podczas wyszukiwania wyrażenia regularnego O(n)? Ilość wpisów w db jest w każdym przypadku taka sama. Myślę, że to algorytm wyszukiwania?
Flashrunner
8

Możesz użyć. locate /rootpath/*filenamespecNie próbowałem tego wcześniej, ale wydaje się, że działa. Oto przykładlocate /home/tim/science/*math*

Możesz przyjrzeć się findpoleceniu, a nie locatetego rodzaju zachowaniu. Składnia byłaby find rootforsearch -name filenamepattern -print. W tym przypadku twój przykład wymagałby. find /home/tim/science -name *math* -printNie tak szybko, jak zlokalizować, ponieważ nie ma bazy danych do przeszukania ... to faktycznie przeszukuje system plików. Istnieje wiele opcji, z których możesz skorzystać także oprócz drukowania, jeśli zamierzasz coś zrobić z plikiem.

Nerdfest
źródło
Jest to najlepsza odpowiedź, ponieważ locatesama się używa (nie wymaga żadnych innych narzędzi, takich jak grep) i nie zawiera wyrażeń regularnych (które są ładne, ale w tym przypadku niepotrzebne).
Tom
Ten działa naprawdę jak urok, którego można użyć do zlokalizowania do wyszukiwania plików w określonym katalogu Ścieżka, dzięki @Nerdfest
amit_game 15'16
1

Dla mnie najwygodniejszy jest

cd /home/tim/science
locate math | grep `pwd`
alex440
źródło
Czy naprawdę przeczytałeś pytanie?
Tessaracter