Odwołajmy się do źródła niezawodnego: Manuala.
1) man locate => locate - wyszukuje pliki w okresowo aktualizowanej bazie danych [...]
2) man find => find - szuka plików w hierarchii katalogowej [...]
Początkującym (choć nie tylko) często łatwiej przychodzi locate, które bez aktualizacji bazy będzie też znacząco szybsze, więcej rzeczy natomiast osiągniemy dzięki find (choć często we współpracy z czymś jeszcze). Natomiast warto jest wiedzieć o haczykach obu, by dobrze wybrać odpowiednio dla swojej potrzeby.
locate
* okresowa aktualizacja - stwórz plik test i spróbuj go zlokalizować. Bez aktualizacji bazy locate - nie uda Ci się. Inna strona tego samego medalu: usuń lub zmień nazwę pliku, a w bazie nadal będziesz miał stary wpis. Możesz albo poczekać na aktualizację (uruchamiane są zwykle nocą, administrator może to ustawić) albo wywołać (mając odpowiednie prawa)
Kod: Zaznacz cały
sudo updatedb
* PRUNEPATHS - locate nie szuka w miejscach określonych przez tą zmienną (PRUNEPATHS znajdziesz w /etc/updatedb.conf) - czasem to może zaskoczyć (np. jak się okaże, że katalog tymczasowy, lub gorzej: wszystkie podmontowywane urządzenia mające ścieżkę zaczynającą się od /mnt/... albo od /media/... są domyślnie wyłączone z locate).
* zewnętrzne nośniki - USB, płytki, inne takie - szukanie tu z locate może być problematyczne z racji dwu powyższych haczyków.
Zalety: szybkość, prostota obsługi, nie łazi po urządzeniach, indeksacja zwykle biegnie w tle, zatem nie powinna przeszkadzać, wreszcie nie przestrasza koniecznością poznania Basha (choć Bash nie jest taki straszny, jak go niektórzy malują).
Domyślnie szuka w całej bazie (czyli po wszystkich zindeksowanych plikach) i zakładając, że podałeś kawałek nazwy.
Kod: Zaznacz cały
a-desktop:~$ locate strona
/home/tjb/strona.css
/home/tjb/strona.html
/usr/share/pixmaps/faces/astronaut.jpg
Kod: Zaznacz cały
a-desktop:~$ locate -i rdz
/home/tjb/rdz_dziekanat
/home/tjb/Pulpit/Ubuntu_RDZ.txt
/home/tjb/Pulpit/rdz
/home/tjb/Pulpit/12M/RDZ
/home/tjb/Pulpit/zdjęcia/Zdjęcia/Moje obrazy/potwierdzenieWplaty.JPG
/home/tjb/bin/rdz.sh
a-desktop:~$ locate rdz
/home/tjb/rdz_dziekanat
/home/tjb/Pulpit/rdz
/home/tjb/Pulpit/zdjęcia/Zdjęcia/Moje obrazy/potwierdzenieWplaty.JPG
/home/tjb/bin/rdz.sh
Zacznę od przykładu:
Kod: Zaznacz cały
a-desktop:~$ find rdz
find: `rdz': Nie ma takiego pliku ani katalogu
a-desktop:~$ find rdz*
rdz_dziekanat
a-desktop:~$ find rdz\*
find: `rdz*': Nie ma takiego pliku ani katalogu
a-desktop:~$ find rdz*/*
find: `rdz*/*': Nie ma takiego pliku ani katalogu
a-desktop:~$ find rdz*\*
find: `rdz**': Nie ma takiego pliku ani katalogu
a-desktop:~$ find -name rdz*
./rdz_dziekanat
a-desktop:~$ find -name rdz\*
./Pulpit/rdz
./rdz_dziekanat
./bin/rdz.sh
* wymaga precyzji: przy źle podanej ścieżce wyszukiwania albo złym podaniu poszukiwanego wzorca (np. bez name czy iname, albo z \* po tylko jednej stronie) banalnie prosto jest dostać kilkadziesiąt ekranów tekstu z wyników wyszukiwania... albo nie dostać wyników, o jakich wiemy, że są. Przykłady wyżej i niżej, z szukaniem 'rdz'.
* masa opcji, długa lektura by znaleźć to czego potrzebujesz, łatwo przeoczyć ustawienia domyślne lub o nich nie doczytać
* włazi toto wszędzie gdzie mu każesz. Nawet tam, gdzie nie powinien lub gdzie i tak nic nie znajdzie (w urządzenia np.). Rezultatem jest sporo haseł w stylu "Brak dostępu do urządzenia", co powoduje, że przy szukaniu o większym zakresie, komunikaty błędów trzeba po prostu wyciąć, by nie przegapić tego, czego szukamy. Wycinasz = przekierowujesz ich wydruk w pustkę, a nie na ekran. O, tak:
Kod: Zaznacz cały
find ścieżka opcje 2> /dev/null
Domyślnie szuka w bieżącym katalogu, dokładnie tego, co mu kazałeś.
Kod: Zaznacz cały
a-desktop:~$ find strona
find: `strona': Nie ma takiego pliku ani katalogu
Kod: Zaznacz cały
a-desktop:~$ find -iname rdz\*
./Pulpit/12M/RDZ
./Pulpit/rdz
./rdz_dziekanat
./bin/rdz.sh
Ważne jest też [b]gdzie[/b] damy ? albo * i czy zrobimy to bez \ czy z nim (choć to nie zawsze oba poniższe polecenia dają ten sam rezultat):
[code]
a-desktop:~$ find -iname *rdz\*
./przedświąteczneRDZy
./Pulpit/12M/RDZ
./Pulpit/rdz
./Pulpit/zdjęcia/Zdjęcia/Moje obrazy/potwierdzenieWplaty.JPG
./Pulpit/Ubuntu_RDZ.txt
./rdz_dziekanat
./bin/rdz.sh
a-desktop:~$ find -iname \*rdz\*
./przedświąteczneRDZy
./Pulpit/12M/RDZ
./Pulpit/rdz
./Pulpit/zdjęcia/Zdjęcia/Moje obrazy/potwierdzenieWplaty.JPG
./Pulpit/Ubuntu_RDZ.txt
./rdz_dziekanat
./bin/rdz.sh
Kod: Zaznacz cały
find -iname rdz*
Kod: Zaznacz cały
find -iname rdz\*
Podsumowanie:
Na początek polecam locate. Szybkie, bardziej 'zgodne z oczekiwaniami' przeciętnego człowieka, mniej opcji do opanowania. W wielu przypadkach wystarcza, jak często podkreśla k2cl. Jak zacznie Ci brakować mocy, opcji, będzie uwierać opieranie się na bazie lub konieczność jej indeksacji - wybierz find.
Bodajże Ethanak podsumował dość zgrabnie różnicę: locate szuka gdzie coś BYŁO, a find, gdzie coś JEST. I bez odpalenia aktualizacji bazy - to jest bardzo trafne spostrzeżenie.
Źródła i dalsza lektura:
1) Manual
Kod: Zaznacz cały
man locate
man locatedb
man updatedb
man find
3) Angielskojęzyczne strony:
a) Ciekawsze zastosowania locate: http://linuxservertutorials.blogspot.co ... ocate.html
b) Parę sposobów z find: http://eriwen.com/productivity/find-is- ... iful-tool/
c) Dobra strona dla find: http://www.linux.ie/newusers/beginners- ... e/find.php
4) Warta osobnego wyróżnienia strona anglojęzyczna, gruntownie omawiająca szukanie plików w Ubuntu: graficznie (4 narzędzia) i z linii poleceń (6, wliczając find i locate).