Wyszukiwanie plików i katalogów

Damian Stelmach

W tym wpisie zajmiemy się programem banalnym w założeniu, ale bardzo ciekawym w użytkowaniu i obszernym w możliwości. Programem tym jest find czyli sztandarowa wyszukiwarka plików i katalogów.

Program cechuje się sporą liczbą parametrów, które możemy wykorzystywać przy wyszukiwaniu. Raczej nikogo nie zaskoczy fakt, iż wyszukiwać możemy pliki po nazwach czy typie, ale już pewnie część będzie zaskoczona, że pliki również wyszukiwać można np. po czasie od daty ich ostatniej modyfikacji, po uprawnieniach czy właścicielu. Poniżej przedstawiam kilka przykładów użycia:

Wyszukanie plików i katalogów w lokalizacji bieżącej, które w swojej nazwie zawierają frazę dan:

find . -iname 'dan*'

Wyszukanie plików w lokalizacji bieżącej, wyłącznie z rozszerzeniem txt:

find . -iname '*.txt'

Wyszukanie wyłącznie plików w lokalizacji bieżącej, które w swojej nazwie zawierają frazę dan:

find . -iname 'dan*' -type f

Wyszukanie wyłącznie plików w katalogu domowym użytkownika damian, które w swojej nazwie zawierają frazę dani zostały zmodyfikowane w ciągu ostatnich 31 dni:

find /home/damian -iname 'dan*' -type f -mtime -31

Wyszukanie wyłącznie plików w katalogu domowym użytkownika damian, które w swojej nazwie zawierają frazę dan, zostały zmodyfikowane w ciągu ostatnich 31 dni, a ich właścicielem jest użytkownik stefanz jednoczesnym wylistowaniem za pomocą polecenia ls:

find /home/damian -iname 'dan*' -type f -mtime -31 -user stefan -ls
ZAPAMIĘTAJ!
Parametry w poleceniu find można łączyć tworząc zapytanie wielowarunkowe, można również paramterów używać pojedynczo!

Możliwości programu find nie kończą się tylko na wyszukiwaniu plików czy katalogów. Korzystając z parametru exec możemy wykonywać całkiem sporą liczbę operacji na wyzyskiwanych zbiorach. Możemy je np. usunąć, skopiować do nowej lokalizacji, zmienić ich właściciela czy uprawnienia, a nawet odczytać interesujące nas informacje zawarte w tych plikach łącząc wyniki wyszukiwania ze znany już z poprzedniego wpisu poleceniem grep.

Zacznijmy od polecenia, które odnajdzie w bieżącej lokalizacji tylko pliki, które mają w swojej nazwie literę d, a następnie zmieni uprawnienia tych plików na 777:

sudo find . -iname 'd*' -type f -exec chmod 777 {} \;
UWAGA!
Zamiana uprawnień do plików czy katalogów wymaga praw root’a, dlatego należy w takim przypadku wykonać to polecenie na prawach sudo

Na końcu polecenia użyty został ciąg znaków {} \;. To ważne, aby o nim nie zapominać ponieważ jest to element konieczny przy stosowaniu parametru exec.

No to teraz polecenie, które odnajdzie w bieżącej lokalizacji tylko pliki, które mają w swojej nazwie literę d, a następnie przekopiuje te pliki do katalogu kopia (co ważne ten katalog musi istnieć!):

find . -iname 'd*' -type f -exec cp {} kopia \;

Ostatni przykład wykorzystania parametru exec to połączenie go ze znanym już nam poleceniem grep. Załóżmy, że chcemy odnaleźć ze zbioru plików, których nazwa rozpoczyna się na literę d, zapisanych w bieżącej lokalizacji frazę model. Nasze polecenie wówczas będzie wyglądało tak:

find . -iname 'd*' -type f -exec grep -i 'model' {} \;