Wyszukiwanie pliku

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]).


Dalsza część kursu
Poprzednia część kursu
Jadłospis