W tym podrozdziale omówimy szerzej – szczególnie z uwzględnieniem zastosowania w tym poleceniu wyrażeń regularnych - polecenie  find (szukaj) z którym zapoznaliśmy się już w rozdziale 3. Polecenie find jest w realnym świecie porównywane do szwajcarskiego zegarka. Narzędzie to potrafi przeszukać wszystkie wpisy w systemie plików i wyświetlać rezultaty spełniające zadane kryteria. Pod wieloma względami te właśnie duże możliwości kryteriów, które możemy zastosować w polecenie  find , przesądzają o potędze tego narzędzia.

Polecenie  find  jest bardzo przydatne do badania i wykonywania poleceń związanych z całą strukturą katalogów. Polecenie  find  przeszukuje system plików w dół począwszy od określonego katalogu, może również wykonywać podstawiając w nich jako argumenty wyszukane nazwy plików lub katalogów. Powtórzmy polecenie  find   prowadzi wyszukiwania plików lub katalogów według zadanych kryteriów od wskazanego katalogu „w dół” (jak pamiętamy struktura katalogu ma postać odwróconego drzewa), uwzględniając wszystkie podkatalogi, z czego wynika, ze jeżeli wskazanym katalogiem jest  root  ( / ) to wówczas przeszukujemy całą strukturę katalogów systemu Linux.

 

Polecenie  find  wyszukuje pliki w strukturze katalogu (katalogów) i może na wyszukanych plikach wykonywać różne operacje, dlatego strukturę polecenia find można przedstawić w następujący sposób:

find - w jakim katalogu wyszukujemy pliki – jakie kryteria selekcji – co robimy ze znalezionymi plikami ?

 

Weźmy najprostszy przykład: 

find  /……     →     oznacza, ze wyszukiwania będą odbywały się w całej strukturze katalogów.

find  /home…..     →     oznacza, że wyszukiwania będą odbywały się w katalogu domowym home.

 

Jakimi kryteriami selekcji dysponujemy w poleceniu   find ?

Kryteria → Funkcja

-name →  wyszukuje plik o określonej nazwie

-type → wyszukuje pliki, których typ jest określony jako: 

d  →  katalog

f  →  plik normalny

b  →  plik blokowy

c  →  plik znakowy

l  →  dowiązanie symboliczne

-path ‘wzorzec’ →  wyszukuje pliki, których ścieżka dostępu pasuje do wzorca

-links →  wyszukuje pliki z liczbą N dowiązań do plików

-size →  wyszukuje pliki, które mają wielkość N

-user →  wyszukuje pliki, które należą do użytkownika

-perm →  wyszukuje pliki, które mają prawa dostępu określone jako tryb

-atime →  wyszukuje pliki, które były otwierane w N dniach

-mtime →  wyszukuje pliki które zostały zmodyfikowane w N dniach

 

Co robimy z wyszukanymi plikami czyli jakie są kryteria egzekucji na plikach wyselekcjonowanych przez polecenie  find ?

-print →  przekazuje na standardowe wyjście nazwę odnalezionego pliku oraz jego pełną ścieżkę dostępu

-exec polecenie {}\; →  uruchamia polecenie dla odnalezionego pliku

-ok. polecenie {} \; →  potwierdza uruchomienie polecenia dla odnalezionego pliku

 

Z dotychczasowego wykładu wynika, że polecenie  find może przybrać postać niezwykle skomplikowaną, dlatego najlepszą metodą jego nauki będzie analiza poniższych przykładów, które stopniując trudność umożliwią uczniowi zapoznanie się z skomplikowana strukturą polecenia.

 

$  find  . –type  d

 Polecenie wyszukuje tylko katalogi znajdujące się w bieżącym katalogu (bieżący katalog jest oznaczony w poleceniu  „.”.

 

$ find . –name piotr1 –print

Polecenie to wyszukuje wszystkie pliki o nazwie piotr1

 

$ find . –type d  -print

Polecenie to wyszukuje tylko nazwy katalogów

 

$ find /home –name ‘*.c’ –print

Polecenie to wyszukuje wszystkie pliki których sufiks jest „.c”

 

$ find   ~  -name  ‘p*’ –print

W powyższym poleceniu tylda „~” oznacza katalog domowy użytkownika czyli punkt rozpoczęcia poszukiwań. Polecenie znalazło jeden plik którego nazwa zaczyna się na „p” (wzorzec p*).

 

Uwaga: czy możemy kryterium egzekucji –print, zastąpić używając innego wyrażenia; inaczej mówiąc czy możliwe jest uzyskanie tego samego rezultatu innym sposobem, wykorzystując dotychczas poznane polecenia i zasady obowiązujące w systemie Linux ? Tak, poznaliśmy w rozdziale III tzw. potok (pipe) i wykorzystując jego mechanizm, przy pomocy np. polecenia more lub cat, otrzymamy te same rezultaty

 

$ find . –name piotr1  |   more

$ find . –type d   |  more

$ find /home –name ‘*.c’  |  more

$ find   ~  -name  ‘p*’   |   more

 

Wniosek jest banalny ale bardzo ważny: ten sam rezultat możemy uzyskać stosując różne polecenia i różne mechanizmy wewnętrzne systemu operacyjnego Linux.


Polecenie  find może również sprawdzać warunki dotyczące nazwy i podejmować odpowiednie działania. Aby na przykład zmienić prawa dostępu wszystkich podkatalogów katalogu domowego /home, można wydać polecenie

$ find . –type  d –exec chmod 770  {} \;

Uwaga: używając opcji  -exec   należy zachować szczególna ostrożność ponieważ można po niej podać cokolwiek -  w tym polecenie mv, rm itd. Jeżeli zamiast opcji –exec użyjemy opcji –ok., przed każda operacją wymagane będzie potwierdzenie

 

$ find . –type d  -ok.  chmod  770 {} \;

find poprosi użytkownika o potwierdzenie , zanim wykona polecenie.

 

Dotychczas przedstawiliśmy względnie prostą postać polecenia find , w tej chwili wprowadzimy jeszcze dwie dodatkowe grupy kryteriów.

 

Pierwszym z nich są parametry kryteriów, które wyrażają ilość lub wielkość mogą one przybierać trzy różne formy:

1. Kryterium n oznacza dokładnie liczba symbolizująca n, tak więc „-ctime 5” wyraża że plik był utworzony 5 dni temu

2. Kryterium –n oznacza, mniejszy od liczby symbolizującej n, tak więc „-size -1000”, wyszukuje pliki których objętość jest mniejsza od 1000 octetów

3. Kryterium +n oznacza, większy od liczby symbolizującej n, tak więc „-size +1000” wyszukuje pliki których objętość jest większa od 1000 octetów.

 

Drugim z nich są parametry logiczne, które np. mogą wiązać wiele kryteriów wyborów; z definicji operatorem logicznym wiążącym różne kryteria wyboru jest ET (i), jednak istnieją także inne operatory:

Operator logiczny                Jego oznaczenie w poleceniu  find

ET                                         -a

OU                                         -o

NON                                        !

(wyrażenie)                             \(wyrażenie\)

 

Kontynuujemy wyjaśnianie działanie polecenia   find na przykładach:

$ find /home  -mtime 0 –print

$ find /home –type f  -size 0 –exec rm –f {}\;

 

Polecenie wyszukuje i niszczy wszystkie pliki, których objętość wynosi 0 octetów, czyli pliki puste. Zwróćmy uwagę, że te – jego rezultaty - polecenie można uzyskać w inny sposób:

$ rm  ‘find /home –type f –size 0  -print’

$ find /home ! –user piotr1 \( -size +10000c –o –atime -30\)

Polecenie wyszukuje pliki których właścicielem (użytkownikiem) nie jest  piotr1 i których objętość nie przekracza  10000 octetów i które używano przed 30 dniami

 

$ find  .  –mtime  +20  -exec  rm {}  \;

Polecenie to pozwala wymazać pliki, które nie były modyfikowane od więcej niż 20 dni.

 

To samo można wyrazić za pomocą:

$ rm  ‘find . mtime  +20  -print’

 

 

Wyrażenia Regularne Rozdział 8.5 Darmowy kurs Linux