Jak odszukać pliki utworzone godzinę temu (find)

Spis treści

W linux'ie wszystko może być reprezentowane za pomocą pliku. Te pliki są tworzone, zmieniane i usuwane praktycznie non stop podczas pracy systemu operacyjnego. Zwykle też nie zwracamy uwagi na metadane opisujące pliki w systemie plików, bo przecie bardziej interesuje nas ich zawartość. Niemniej jednak, w pewnych sytuacjach te metadane mogą się okazać bardzo użyteczne. Weźmy sobie przykład partycji /home/ . Prawie zawsze po odpaleniu aplikacji są tworzone na niej nowe pliki lub zmieniane te już istniejące. Jako, że nie zawsze wiemy na jakich plikach operuje dany program, to moglibyśmy przeszukać pliki w katalogu domowym użytkownika i poddać analizie ich czas modyfikacji. Taką operacje możemy przeprowadzić przy pomocy polecenia find i w tym wpisie zobaczymy jak tego dokonać.

Pliki i ich data/czas modyfikacji

Każdy system plików przechowuje w swojej strukturze informacje min. na temat czasu modyfikacji pliku. W przypadku, gdy plik zostaje utworzony lub zmieniony w jakiś sposób, system przepisuje ten czas i ustawia go na aktualną datę i godzinę. Jeśli chcielibyśmy się zaznajomić z informacją o tych znacznikach czasu, to możemy zajrzeć w wyjście polecenia stat , przykładowo:

find-stat-czas-modyfikacji-pliku

Te trzy pozycje na dole, tj. Access: , Modify: i Change: odpowiadają kolejno za ostatni czas dostępu do pliku, czas modyfikacji pliku i czas zmiany i-węzła odpowiedzialnego za plik. Niekoniecznie wszystkie te trzy czasy muszą być takie same jak w tym przypadku powyżej, bo to zależy od operacji przeprowadzanych na pliku. Tak czy inaczej, nas interesuje tutaj głównie czas modyfikacji, w oparciu o który możemy z powodzeniem powiedzieć, czy dany plik został zmodyfikowany w ostatnim czasie.

Jak odnaleźć modyfikowane pliki via find

W debianie mamy pakiet findutils , w którym jest zawarte narzędzie find . Przy jego pomocy jesteśmy w stanie przeszukiwać pliki na dysku w oparciu o całą masę dopasowań. Mamy także kilka opcji dotyczących tych wszystkich widocznych wyżej znaczników czasów. Poniżej jest krótka rozpiska opcji, które przydadzą nam się w procesie szukania plików po czasie modyfikacji. Jako, że na fotce widzieliśmy trzy różne czasy, to w find mamy również trzy parametry:

  • -ctime -- dopasowanie w oparciu o czas zmiany i-węzła.
  • -mtime -- dopasowanie w oparciu o czas modyfikacji pliku.
  • -atime -- dopasowanie w oparciu o czas dostępu do pliku.

Problem z tymi opcjami jest taki, że jeśli byśmy ustawili w nich wartość, np. 1 , to zostanie ona pomnożona przez 24 godziny. Istnieje także opcja -daystart , którą można wykorzystać z tymi powyższymi. W ten sposób, czas będzie liczony od początku aktualnego dnia, zamiast 24h wstecz od aktualnego czasu. Może i to rozwiązanie jest dobre w przypadku nieco bardziej rozległych dat ale nasuwa się pytanie jak wyszukać pliki zmodyfikowana, np. godzinę temu? Trzeba skorzystać z tego poniższego zestawu parametrów:

  • -cmin -- dopasowanie w oparciu o czas zmiany i-węzła.
  • -mmin -- dopasowanie w oparciu o czas modyfikacji pliku.
  • -amin -- dopasowanie w oparciu o czas dostępu do pliku.

Wartość, w oparciu o którą chcemy przeszukać pliki, we wszystkich w/w opcjach można określić na trzy sposoby:

  • 1 -- pliki modyfikowane dokładnie jeden dzień/minutę temu.
  • -1 -- pliki modyfikowane maksymalnie jeden dzień/minutę wstecz w porównaniu do aktualnego czasu.
  • +1 -- pliki modyfikowane minimum jeden dzień/minutę wstecz w porównaniu do aktualnego czasu.

Wyszukiwanie modyfikowanych plików

Jak zatem będą wyglądać polecenia, które odszukają nam pliki modyfikowane w określonym przez nas terminie? To generalnie zależy jaki czas nas interesuje. Możemy także podać przedział czasu. Jeśli chcemy odszukać pliki w katalogu /home/ , które były modyfikowane jedną godzinę temu, to w terminalu wpisujemy poniższe polecenie:

$ find /home/ -mmin -60

Jeśli chcemy, odszukać pliki modyfikowane w ostatnich 3 dniach, to możemy naturalnie skorzystać również z -mmin . NIemniej jednak, przeliczanie dni na minuty to tylko kłopot. Dlatego też lepiej korzystać z -mtime :

$ find /home/ -mtime -3

Z kolei jeśli interesują nas pliki, które były modyfikowane minimum 10 dni temu, to wpisujemy poniższe polecenie:

$ find /home/ -mtime +10

Przedziały czasu określamy podając dwa razy -mtime . Dla przykładu, chcemy uzyskać listę plików, które były modyfikowane 2-5 dni temu:

$ find /home/ -mtime +2 -mtime -5

Oczywiście, opcje -ctime , -mtime , -atime , -cmin , -mmin oraz -amin można łączyć z pozostałymi parametrami polecenia find uzyskując w ten sposób, np. tylko pliki .pdf , które były modyfikowane 2-5 dni temu. Poniżej przykład:

$ find /home/ -mtime +2 -mtime -5 -type f -iname "*.pdf"

Więcej informacji na temat tych w/w parametrów jak i całej masy innych opcji można znaleźć w man find.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.