Narzędzie find w systemie Linux umożliwia nam wyszukiwanie plików/katalogów wg. przeróżnych kryteriów (których jest tyle, że chyba ciężko wymyślić czegoś, czego find nie potrafi…). Natomiast nie wszyscy często wiedzą, że poza umożliwieniem wyszukania, find pozwala także na wykonanie zadanej akcji na wynikach wyszukiwania, co często może być dla nas baaaardzo pomoce.
Najłatwiej przemawiają przykłady, a więc taki mały z życia wzięty, w którym takowa funkcjonalność by się nam przydała:
Załóżmy, że mamy serwer pocztowy na Linux’ie (niech będzie na Postfix’ie), i mamy tam wdrożone mechanizmy skanowania antywirusowego oraz antyspamowego (na bazie aplikacji Amavis). Skanowane maile, które zostały rozpoznane jako spam lub wirus, składane są do katalogu kwarantanny (załóżmy, że będzie to katalog /kwarantanna), tak aby szczególnie maile rozpoznane jako spam nie były bezpowrotnie utracone (może się okazać, że jednak spam to nie był, i wtedy zawsze można przywrócić taki e-mail). Problem w tym, że w ten sposób katalog kwarantanny będzie puchł i puchł, i tak jak dmuchamy balon, będzie się robił się on coraz większy i coraz większy, aż nagle zrobi się „bum”, przy czym w naszej sytuacji tym bum będzie: skończyło się miejsce na dysku (a to rodzi jednak w praktyce spoooore problemy).
Dobrze by było więc w takiej sytuacji może wdrożyć jakiś mechanizm, który by np. usuwał pliki z mailami w katalogu kwarantanny, które są starsze niż … (zakładamy wtedy np.: takie, których ostatnia modyfikacja, nastąpiła 30 dni temu i więcej).
W takiej sytuacji potrzebujemy narzędzi, które wyszukają w zadanym katalogu pliki starsze niż „x” dni i usuną je, i tu wchodzi nam wtedy polecenie find, jak również umożliwiające okresowe/cykliczne wykonywanie takowego polecenia, i tu wchodzi nam narzędzie cron (umożliwiające cykliczne wykonywanie skryptów/poleceń).
Składnia polecenia usuwającego pliki starsze niż x dni w systemie Linux:
find /sciezka/do/katalogu -mtime +30 -exec rm {} \; |
Wyjaśnienie:
- Pierwszy parametr to ścieżka do katalogu w ramach którego chcemy realizować proces wyszukiwania plików/katalogów
- Drugi parametr, -mtime, jest używany do określenia liczby dni, jakie upłynęły od ostatniej modyfikacji pliku/katalogu (jeśli wpiszemy +5, to narzędzie będzie wyszukiwać więc pliki starsze niż 5 dni).
- Trzeci parametr, -exec, umożliwia przekazanie wyników wyszukiwania do zadanego polecenia, które ma wykonać zadaną akację na tymże wyniku wyszukania (kopiowania, przeniesienia, usunięcia, itd. ). Co istotne w ramach tego polecenia-akcji, w miejscu podania celu na którym ma być wykonywana akcja, należy podać dwa nawiasy klamrowe „{}” (pod nie będzie podstawiony wynik wyszukania). Jak również istotne jest, aby polecenie podane w parametrze -exec było zakończone backslashem i średnikiem „\;” – dzięki czemu będzie wiadomo, że właśnie polecenie-akcja jest zakończone, i następny parametr dotyczy znowu polecenia find, a nie nadal polecenia-akcji.
Małe pokazowe praktyczne wykorzystanie na bazie wcześniejszego przykładu problemu:
- Edytujemy plik konfiguracyjny demona cron (omówienie samej aplikacji cron to już troszkę zadanie wykraczające poza tenże artykuł):
mcedit /etc/crontab
gdzie następnie wpisujemy nową linię wpisu, wskazującego, iż co niedzielę o godz. 6:25 rano, będzie na uprawnieniach użytkownika root wykonywane polecenie find, które wyszuka w katalogu /kwarantanna pliki, których ostatnia modyfikacja była 30 dni temu i więcej, i usunie te pliki:
25 6<-->* * 7<->root <->find /kwarantanna/ -mtime +30 -exec rm {} \;
Przykładowo wygląda to następująco:
- Przeładowujemy teraz już tylko demona cron (żeby wczytał nową konfigurację z pliku konfiguracyjnego):
systemctl reload cron
I voila, po wszystkim 🙂