===== FHS ===== Dla uporządkowania gdzie trzymać które pliki, dla Linuksa powstał (na bazie zwyczajów z innych uniksopodobnych systemów) dokument [[https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard|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.#~~ 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 ''**[[https://en.wikipedia.org/wiki/Locate_(Unix)|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.#~~ 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 wzorcem((Wzorcem w takim samym rozumieniu jak dla [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13|powłoki]] – tzn. ''*'' oznacza dowolny tekst, ''?'' dowolny znak, ''[…]'' zakres.)) jest zmieniany na wzorzec ''*//arg//*''. ~~Zadanie.#~~ 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.#~~ 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.#~~ Znajdź pliki o nazwie ''bin''. ~~Zadanie.#~~ Znajdź pliki zawierające w nazwie słowo ''pause'' i w ścieżce katalog ''icons''. ~~Zadanie.#~~ Znajdź pliki zawierające w nazwie znak ''[''. ==== find ==== Narzędzie ''**[[https://en.wikipedia.org/wiki/Find_(Unix)|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 [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html|standard POSIX]], natomiast jego implementacje zwykle umieją dużo więcej niż wymaga POSIX. \\ W tych materiałach opisany jest program ''find'' z [[https://www.gnu.org/software/findutils/|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 //s//''|rozmiar; ''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.#~~ Wykonaj ze swojego katalogu domowego komendę ''find'' (bez argumentów), ''find .config/..'' oraz ''find ~''. \\ Czym różnią się wyniki tych komend? ~~Zadanie.#~~ Znajdź jedną komendą wszystkie pliki w katalogach ''/srv/'' i ''/var/lib/zypp/''. ~~Zadanie.#~~ Znajdź pliki w katalogu domowym których nazwy kończą się na ''.xml''. ~~Zadanie.#~~ Znajdź puste pliki w katalogu domowym. ~~Zadanie.#~~ 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.#~~ Znajdź wszystkie swoje pliki poza swoim katalogiem domowym. ~~Zadanie.#~~ Znajdź w katalogu domowym pliki, dla których grupa nie ma prawa do odczytu. ~~Zadanie.#~~ Wykonaj komendę: ''find \( -type d -ls \) -o \( -print \)''. Kiedy jest uruchamiana akcja ''-ls'', a kiedy ''-print''? Jak zadziała ta komenda bez nawiasów? ~~META: language = pl ~~