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