Narzędzia użytkownika

Narzędzia witryny


Pasek boczny

so:locate_find

FHS

Dla uporządkowania gdzie trzymać które pliki, dla Linuksa powstał (na bazie zwyczajów z innych uniksopodobnych systemów) dokument Filesystem Hierarchy Standard określający jakie katalogi powinny istnieć w Linuksie i do czego należy je wykorzystywać.

W podręczniku systemowym na stronie hier (i, w przypadku Linuksa używającego systemd, też file-hierarchy) mogą znajdować się informacje dotyczące hierarchii plików w danym systemie.

Zadanie 1 Na podstawie FHS / man hier odpowiedz do czego są przeznaczone katalogi:
      • /bin, /usr/bin oraz /sbin, /usr/sbin
      • /lib i /usr/lib
      • /usr/share
      • /etc
      • /opt
      • /root i /home
      • /tmp
      • /var

Wyszukiwanie plików

locate

Narzędzie locate służy do przeszukiwana wcześniej przygotowanej listy plików w systemie.
Lista plików (tzw. baza) jest zwykle aktualizowana codziennie – większość dystrybucji razem z instalacją programu locate do zaplanowanych uruchamianych codziennie zadań dopisuje wywołanie aktualizującej listę plików komendy updatedb.

Współczesne implementacje programu locate przed wyświetleniem nazwy pliku sprawdzają czy plik dalej istnieje i czy użytkownik ma do niego dostęp.
Lista nazw wszystkich plików jest potencjalnym zagrożeniem bezpieczeństwa, stąd dystrybucje stosują różne metody zabezpieczenia dostępu do niej.

Zadanie 2 Użyj komendy locate --statistics do wyświetlenia statystyk listy plików.

Jeśli podano opcję --regex, wszystkie argumenty będą traktowane jako wyrażenia regularne.
W przeciwnym razie każdy argument arg który nie jest wzorcem1) jest zmieniany na wzorzec *arg*.

Zadanie 3 Porównaj działanie komend:
      • locate 'stdint'
      • locate '*stdint'
      • locate --regex '.*stdint'
      • locate --regex '.*stdint$'

locate dopasowuje każdy argument do pełnej ścieżki do pliku (lub, z opcją -b, tylko nazwy pliku) i jeśli choć jeden argument pasuje, wypisuje nazwę pliku na standardowe wyjście. Jeśli podano opcję -A (--all), wszystkie argumenty muszą pasować do pliku żeby jego nazwa została wypisana.

Zadanie 4 Porównaj działanie komend:
      • locate -A bin ps to pdf   vs   locate bin ps to pdf
      • locate -b netpbm   vs   locate netpbm

Po podaniu opcji -0 komenda locate oddziela wypisywane nazwy plików bajtem o wartości zero ('\0') zamiast nową linią ('\n').

Zadanie 5 Znajdź pliki o nazwie bin.

Zadanie 6 Znajdź pliki zawierające w nazwie słowo pause i w ścieżce katalog icons.

Zadanie 7 Znajdź pliki zawierające w nazwie znak [.

find

Narzędzie find służy do wyszukiwania plików: odwiedza rekurencyjnie podane katalogi i wykonuje podane testy bądź akcje dla każdego kolejnego pliku.

Narzędzie find jest włączone w standard POSIX, natomiast jego implementacje zwykle umieją dużo więcej niż wymaga POSIX.
W tych materiałach opisany jest program find z GNU findutils (powszechnie instalowany w dystrybucjach Linuksa).

Z istotnych opcji, polecenie find ma dwie:
-L nakazuje podążać za dowiązaniami symbolicznymi (domyślne),
-H nie podąża za dowiązaniami symbolicznymi (i pozwala je wyszukać jako dowiązania).

find ma specyficzną składnię – najpierw należy podać opcje, potem listę przeszukiwanych ścieżek, na końcu testy i akcje.

Jeśli pominie się listę przeszukiwanych ścieżek, find szuka w bieżącym katalogu.

Jeśli pominie się akcję, find wypisze nazwy znalezionych plików na standardowe wyjście.

Kolejność argumentów ma istotne znaczenie.
find -ls -name '*bash*' wpierw wypisze znalezione pliki, a potem sprawdzi czy mają w nazwie słowo bash,
find -name '*bash*' -ls wpierw sprawdzi czy znalezione pliki mają w nazwie słowo bash, a potem je wypisze.

Testy

Wybrane testy:
find … dopasowuje:
 -name pattern
-iname pattern
nazwę pliku do wzorca pattern
(wersja z -i ignoruje wielkość liter)
 -path pattern
-ipath pattern
ścieżkę do wzorca pattern
(wersja z -i ignoruje wielkość liter)
-type {f|d|l|p|s|c|b}rodzaj pliku – f zwykły, d katalog, l symlink, etc.
-user name
-group name
właściciela / grupę pliku
 
-perm  tryb
-perm -tryb
-perm /tryb
 
uprawnienia:
  dokładnie takie jak podano
- wszystkie podane bity ustawione
/ choć jeden podany bit ustawiony
tryb można zapisać ósemkowo (22) lub symbolicznie (go+w)
-size srozmiar; 512c oznacza 512B; 512M oznacza 512MB;
-512c oznacza co najwyżej 512B, +512c oznacza co najmniej 512B
Uwaga: domyślną jednostką, oznaczaną jako b, są bloki dyskowe, nie bajty
-atime d / -amin min
-ctime d / -cmin min
-mtime d / -mmin min
czas dostępu, zmiany, modyfikacji w dniach (d) lub minutach (min)
poprzedzenie czasu + oznacza ≥, a - oznacza niż podany

Testy można:

  • łączyć operatorami -a (oraz, przyjmowany jako domyślny jeśli nie podano innego) i -o (lub)
    np. find -name baz -o -name bar
  • grupować nawiasami ( i ), ale uwaga – nawiasy są znakiem specjalnym w powłoce, stąd \( i \)
    np. find -size -1M \( -name baz -o -name bar \)
  • negować przez !
    np. find ! -type f ! -type d

Inne istotne testy:
-mindepth n i -maxdepth n określają jak głęboko schodzić wewnątrz katalogów.
-xdev nie wchodzi do katalogów w których są zamontowane systemy plików.
Tzn: jeśli wyszukasz pliku w katalogu /, to find nie będzie szukać wewnątrz katalogu /mnt/cdrom jeśli podmontowano w nim zawartość płyty CD.

Akcje

Wybrane akcje:
-print domyślna akcja - wypisz nazwy oddzielone znakiem nowej linii
-print0 wypisz nazwy oddzielone znakiem '\0'
-delete usuwa pasujące pliki
-exec … {} … ; wykonuje podany program dla każdego znalezionego pliku z osobna (patrz niżej)
-exec … {} + wykonuje podany program dla wszystkich znalezionych plików razem (patrz niżej)

Jeśli find -exec program arg1 arg2 \{\} \; znajdzie pliki: one, two i three, to wykona:
program arg1 arg2 one
program arg1 arg2 two
program arg1 arg2 three

Jeśli find -exec program arg1 arg2 \{\} + znajdzie pliki: one, two i three, to wykona:
program arg1 arg2 one two three

W -exec każde wystąpienie wyrażenia {} jest zastępowane nazwą pliku.
Uwaga: {} (i ;) są znakami specjalnymi dla powłoki, więc trzeba je escape'ować (tzn. \{\}) lub zamknąć w cudzysłowach ("{}").
Dla składni -exec … {} + argument {} musi wystąpić jednokrotnie jako ostatni argument.

Zadania

Zadanie 8 Wykonaj ze swojego katalogu domowego komendę find (bez argumentów), find .config/.. oraz find ~.
Czym różnią się wyniki tych komend?

Zadanie 9 Znajdź jedną komendą wszystkie pliki w katalogach /srv/ i /var/lib/zypp/.

Zadanie 10 Znajdź pliki w katalogu domowym których nazwy kończą się na .xml.

Zadanie 11 Znajdź puste pliki w katalogu domowym.

Zadanie 12 Znajdź i wyświetl pliki z katalogu /usr/include o rozmiarze mniejszym bądź równym 32B.
Uwaga: dla find jednostka b lub brak jednostki to bloki dyskowe. Bajty są oznaczane jednostką c.

Zadanie 13 Znajdź wszystkie swoje pliki poza swoim katalogiem domowym.

Zadanie 14 Znajdź w katalogu domowym pliki, dla których grupa nie ma prawa do odczytu.

Zadanie 15 Wykonaj komendę: find \( -type d -ls \) -o \( -print \). Kiedy jest uruchamiana akcja -ls, a kiedy -print? Jak zadziała ta komenda bez nawiasów?

1) Wzorcem w takim samym rozumieniu jak dla powłoki – tzn. * oznacza dowolny tekst, ? dowolny znak, […] zakres.
so/locate_find.txt · ostatnio zmienione: 2024/03/28 14:39 przez jkonczak