Program find

#find

Program find pozwala wyszukiwać pliki spełniające kryteria określone przez użytkownika.

Kryteria mogą obejmować takie elementy jak nazwa pliiku, daty modyfikacji, uprawnienia dostępu.

Program find może wypisać pliki lub informacje o nich na standardowe wyjście. Możliwe jest również wykonanie polecenia dla każdego znalezionego pliku.

Podstawowe wywołanie:

$ find katalog <kryteria wyszukiwania>

Katalog, dokładnie jeden, musi wystąpić przed kryteriami. Wyszukiwanie będzie się dobywać w katalogu i jego podkatalogach.

Kryteria wyszukiwania mogą obejmować również akcje. Jeśli akcja nie będzie zdefiniowana, nazwa pliku zostanie wypisana na stdout.

Przykładowym kryterium wyszukiwania może być nazwa pliku:

$ find ~ -name '*.txt'

wyszukuje wszystkie pliki z rozszerzeniem .txt w katalogu domowym i podkatalogach

Kryteria wyszukiwania można łączyć z użyciem -o (or – alternatywa logiczna) -a (and – koniunkcja), zaprzeczać warunki z użyciem !, grupować z użyciem nawiasów okrągłych ( ). Jeśli dwa kryteria są podane obok siebie bez operatora, domyślna jest koniunkcja.

Uwaga! Nazwy pliku mogą być wzorcami, znanymi Państwu z poprzednich laboratoriów. Należy jednak zadbać o to, żeby nie zostały zinterpretowane przez shell przed przekazaniem find. Stąd cytowanie tego parametru. Podobnie nawiasy okrągłe – też są znakami specjalnymi.

Obliczanie wartości jest leniwe, to znaczy, że jeśli warunek po lewej stronie koniunkcji jest fałszywy, ten po prawej nie jest już obliczany. Analogiczna sytuacja ma miejsce przy alternatywie – jeśli lewy warunek jest prawdziwy, prawy nie jest już obliczany.

Ćwiczenia

  1. Wypisać wszystkie pliki z rozszerzeniem .conf z katalogu /etc/ i podkatalogów.

  2. Podobnie. Tym razem wypisać wiersze postaci <rozmiar>:<ścieżka> Podpowiedź: użyć opcji -printf

    Co się stanie, gdy zamienimy ze sobą opcje -printf i -name? (razem z ich argumentami)

    Wyjaśnić to zachowanie na podstawie manuala. (Jakiś chętny to wyjaśnienia wszystkim?)

  3. Wypisać pierwsze trzy linie z każdego z plików .conf z /etc Użyć opcji -exec. {} będzie zastąpione nazwą pliku -exec musi zostać zakończone średnikiem podanym jako pojedynczy argument.

    Uwaga! ; { } są znakami specjalnymi. Trzeba zapobiec ich interpretacji przez shell.

  4. Znaleźć pliki zmodyfikowane więcej niż 12 dni temu w katalogu domowym i podkatalogach. Jaka jest różnica pomiędzy wartościami -12 +12 12 dla mtime?

  5. Powtórzyć zad4, ale tym razem wyszukać tylko plików w katalogu domowym, bez podkatalogów.