Odpowiedzi:
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.
locate
wielu pojedynczych argumentów wiersza poleceń. 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)
-r
opcja każe locate traktować argument jako wzorzec regularny. 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
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\ regex
lub-/"my regex"
na przykład. locate -ir ~/".*"la\ bella\ vita
jest 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 -b
lub --basename
.., w którym to przypadku wyrażenie regularne ^
odnosi się tylko do nazwy basename ...
Najczęściej używam locate -bir
PS .. Locate
jest 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 updatedb
aby odświeżyć bazę danych locate ... (ale jeśli niedawno ją dodałeś, prawdopodobnie wiesz, gdzie to jest:) ....
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.
locate
robi to O(log(n))
szukanie nad locatedb
kiedy 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
.
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?
Możesz użyć. locate /rootpath/*filenamespec
Nie próbowałem tego wcześniej, ale wydaje się, że działa. Oto przykładlocate /home/tim/science/*math*
Możesz przyjrzeć się find
poleceniu, a nie locate
tego 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* -print
Nie 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.
locate
sama 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).
Dla mnie najwygodniejszy jest
cd /home/tim/science
locate math | grep `pwd`