Jak się domyślasz, to jest niesamowicie potrzebne, ... , blaaaa... , blaaa...
Tfu, co za banały! Chyba daruję sobie resztę wstępu, sam wiesz, jak często się
gubią pliki w drzewie katalogów.
Pliku możesz szukać dwoma poleceniami: find i locate.
O ile pierwsze ma więcej możliwości, o tyle drugie jest znacznie szybsze.
Przyjrzyjmy się najpierw komendzie locate.
To polecenie ma składnię tak prostą, że prostszy byłby tylko interfejs
telepatyczny: locate fstab wypisze na ekran wszystkie pliki
z fstab w nazwie czy ścieżce. Wypisany zostanie zarówno plik
/etc/fstab, jak i /usr/share/fstab/nazwa-pliku (o
ile taki oczywiście istnieje :) ). Powoduje to konieczność przefiltrowania
wyników przez grep (spróbuj komendy locate icon | wc -l,
policzysz sobie ilość takich plików, dostaniesz pewnie ok. 1000). Domyślnie
locate dokonuje wyszukiwania rozróżniając wielkość liter (case
sensitive search). Żeby wyłączyć rozróżnianie, dodaj opcję -i
(locate -i czego-szukamy). Żeby natomiast włączyć szukanie wyrażenia regularnego, dodajesz opcję -r
(koniecznie przed wyrażeniem szukanym).
Jeszcze podam, co zrobić, jeśli dostaniesz komunikat w stylu warning:
locate: could not open database: /var/lib/slocate/slocate.db: No such file or
directory. Udaj się do konta root i wydaj komendę updatedb.
Widzisz, locate dlatego jest taki szybki, ponieważ nie szuka nazw
po katalogach, tylko co jakiś czas listuje wszystkie katalogi, a przy szukaniu
wypisuje wpisy pasujące do wzoru. Za to musi co jakiś czas uaktualniać bazę
z wpisami, więc najświeższe pliki nie będą uwzględnione. Polecenie
updatedb odświeża właśnie tę bazę wpisów.
find z kolei to nie polecenie. To zaklęcie. Pozwala na niemalże
kosmiczne rzeczy. Chociaż składnię ma nawet prostą: find gdzie-szukać
wyrażenie. Dłuższego wytłumaczenia wymaga wyrażenie. To nie jest
wyrażenie regularne. Tutaj możesz umieścić swoje wymagania co do nazwy pliku
(-name, -iname, -regex, -iregex),
wielkości (-size), praw dostępu (-perm) a nawet typu
pliku (urządzenie znakowe/blokowe, katalog, zwykły plik, link:
-type). Wymagania możesz łączyć spójnikami
logicznymi -and, -or oraz -not i nawiasami
okrągłymi (które jednak musisz poprzedzić backslashem, żeby bash ich nie
próbował interpretować). Brak spójnika między wymaganiami oznacza postawienie
spójnika -and, więc ten nie jest niezbędny. A teraz parę słów
o opcjach dotyczących poszczególnych wymagań:
No to wiemy już, czego szukamy, przydałoby się wiedzieć, co z tym zrobimy.
Jak nie podamy żadnej opcji odnośnie tego, to find domyśla się, że
chcemy podać opcję -print (wypisać znalezione pliki). Jeśli chcemy
coś zrobić na tych plikach, to podajemy opcję -exec w taki sposób:
find . -name maska -exec polecenie --przelaczniki-do-polecenia \{\}
\; gdzie \{\} zostanie zamienione na nazwę pasującego pliku
(tak, tu backslashe też są po to, żeby bash nie interpretował nawiasów
klamrowych), a \; oznacza koniec komendy, którą find
wykona na pliku (z backslashem identyczna historia).
Ta część kursu już się dostatecznie rozrosła, żeby ją zakończyć. Po więcej
sztuczek z findem odsyłam do manuala (man find) i do
stron info (info find).
Może się zdarzyć, że szukasz pliku wykonywalnego albo chcesz się dowiedzieć, co to za polecenie xxx. Tu się przydają trzy polecenia: which, whereis i type. Pierwsze wypisuje nazwę pliku, który zostanie uruchomiony (which mkdir powinno wypisać /bin/mkdir). which przeszukuje ścieżkę poszukiwań plików wykonywalnych, więc wypisze, co bash zrozumie pod podaną komendą. Drugie polecenie jest podobne do which, ale wypisze dodatkowo położenie manuali dotyczących podanego polecenia. Na koniec komenda wbudowana basha type. Ta wypisuje dokładnie to, co bash rozumie za daną komendę. A może ją rozumieć na kilka sposobów: komenda jest aliasem (o czym w sekcji o personalizacji), funkcją (sekcja o skryptach), komendą wbudowaną, plikiem wykonywalnym lub zahaszowanym (bash nie będzie szukał takiego pliku po ścieżce, bo pamięta ją [poczytaj help hash]).