Zmiana daty i godziny utworzenia pliku w Linux/Unix

Czasami istnieje konieczność zmiany daty i godziny utworzenia jakiegoś pliku w systemie Linux/Unix. Korzystam z tego gdy wiem, że w CRON jest ustawione zadanie, które kasuje wybrane pliki starsze niż 30 dni. Jak mogę zatem zapobiec kasowaniu plików, które chciałbym jeszcze zachować, a nie chce przenosić ich do innej lokalizacji, czy zmieniać im nazwy?

Zacznijmy wpierw od przykładu. Zakładając, że dzisiaj jest 20 maja 2021 r. oraz, że w katalogu logi posiadam następujące pliki:

May 28 2020 plik-log1.txt
Jun 17 2020 plik-log2.txt
Jul 8 2020 plik-log3.txt
Sep 18 2020 plik-log4.txt
Feb 24 11:23 plik-log5.txt
Feb 24 11:28 plik-log6.txt
Feb 24 11:28 plik-log7.txt
May 10 12:53 plik-log8.txt

W CRON dodaję zadanie które kasuje pliki starsze niż 30 dni. Robię to poniższym poleceniem:

find /logi/plik-log*.txt -mtime +30 -exec rm {} \;

Jeżeli CRON wykonałby się teraz usunąłby wszystkie pliki starsze niż 30 dni, zatem w katalogu zostałyby tylko:

Feb 24 11:23 plik-log5.txt
Feb 24 11:28 plik-log6.txt
Feb 24 11:28 plik-log7.txt
May 10 12:53 plik-log8.txt

Mi zależy, aby poniższe pliki pozostały nie ruszone. Jak zatem zapobiec usunięciu starszych plików?

Jun 17 2020 plik-log2.txt
Jul 8 2020 plik-log3.txt

Możemy zmienić datę i godzinę ich utworzenia. Aby tego dokonać skorzystamy z komendy touch z parametrem -t.
Jej składnia jest następująca:

touch -t YYYYMMDDHHMM.SS plik

Poszczególne parametry oznaczają:

YYYY - rok
MM - miesiąć
DD - dzień
HH - godzina
MM - minuty
SS - sekundy

Teraz możemy wskazać “własną” datę oraz godzinę utworzenia plików, niech to będzie np. 31 grudzień 2050 r. godzina 23:59:59. Polecenie wyglądać będzie wtedy następująco:

touch -t 205012312359.59 plik-log2.txt plik-log3.txt

Teraz, gdy wylistujemy pliki z naszego katalogu zobaczymy:

May 28 2020 plik-log1.txt
Dec 31 2050 plik-log2.txt
Dec 31 2050 plik-log3.txt
Sep 18 2020 plik-log4.txt
Feb 24 11:23 plik-log5.txt
Feb 24 11:28 plik-log6.txt
Feb 24 11:28 plik-log7.txt
May 10 12:53 plik-log8.txt

Zaś nasze polecenie kasujące pliki starsze niż 30 dni:

find /logi/plik-log*.txt -mtime +30 -exec rm {} \;

pozostawi nam pliki, dla których zmieniliśmy datę i godzinę. Zawartość katalogu wygląda teraz następująco:

Dec 31 2050 plik-log2.txt
Dec 31 2050 plik-log3.txt
Feb 24 11:23 plik-log5.txt
Feb 24 11:28 plik-log6.txt
Feb 24 11:28 plik-log7.txt
May 10 12:53 plik-log8.txt