Snažím se pochopit proč najít
interpretuje časy úprav souborů tak, jak to dělá. Konkrétně nechápu, proč -mtime +1
nezobrazuje soubory starší než 48 hodin.
Jako příklad testu jsem vytvořil tři testovací soubory s různými modifikovanými daty:
[[email protected]obox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3
Potom jsem spustil find pomocí -mtime +1
přepínač a získal následující výstup:
[[email protected] findtest]# find -mtime +1
./foo3
Potom jsem spustil find s -mmin +1440
a získal následující výstup:
[[email protected] findtest]# find -mmin +1440
./foo3
./foo2
Podle manuálové stránky pro hledání chápu, že se jedná o očekávané chování:
-mtime n
File’s data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
Tohle mi ale pořád nedává smysl. Pokud je tedy soubor starý 1 den, 23 hodin, 59 minut a 59 sekund, najít -mtime +1
ignoruje to všechno a zachází s tím, jako by to bylo 1 den, 0 hodin, 0 minut a 0 sekund? V takovém případě není technicky starší než 1 den a ignorován?
Ne… ne… počítá.
Přijatá odpověď:
Jednoduchá odpověď je, myslím, že vaše implementace find se řídí standardem POSIX/SuS, který říká, že se musí chovat tímto způsobem. Citace z SUSv4/IEEE Std 1003.1, vydání 2013, „najít“:
-mtime n
Primární hodnota bude vyhodnocena jako pravdivá, pokud je čas úpravy souboru odečtený
od inicializačního času dělený 86400 (se všemi vyřazenými zbytky) je n.
(Jinde v tomto dokumentu je vysvětleno, že n
může být ve skutečnosti +n
a význam toho jako „větší než“).
Pokud jde o to, proč standard říká, že se tak bude chovat – no, předpokládal bych, že dlouho v minulosti byl programátor líný nebo o tom nepřemýšlel a prostě napsal kód C (current_time - file_time) / 86400 . Celočíselná aritmetika C zahodí zbytek. Skripty se spouštěly v závislosti na tomto chování, a proto bylo standardizováno.
Chování podle specifikace by bylo také přenositelné do hypotetického systému, který by ukládal pouze datum změny (nikoli čas). Nevím, jestli takový systém existoval.