Snažím se zabalit mysl proč interpretuje soubor find časy úprav tak, jak to dělají. Konkrétně nechápu, proč -mtime +1 neukazuje soubory staré méně než 48 hodin.

Jako příklad testu Vytvořil jsem tři testovací soubory s různými upravenými daty:

[root@foobox 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 

Poté jsem pomocí přepínače -mtime +1 spustil find a dostal následující výstup:

[root@foobox findtest]# find -mtime +1 ./foo3 

Poté jsem spustil find s -mmin +1440 a dostal následující výstup:

[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2 

Podle manuálové stránky pro vyhledá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. 

To mi ale stále nedává smysl. Pokud je tedy soubor starý 1 den, 23 hodin, 59 minut a 59 sekund, find -mtime +1 to všechno ignoruje a zachází s ním jako s 1 dnem, 0 hodin a 0 minut a 0 sekund staré? V takovém případě to není technicky starší ten 1 den a ignorováno?

Ne … nepočítá …

Komentáře

  • Zpočátku mi to připadalo také vtipné, ale když uvážíte, že měří stáří souborů v celých dnech, pak to dělá přesně co ‚ očekáváte. Nelze ‚ poskytnout soubory staré 1 den. Soubor, který je starý (1,99) dne, není > 1.
  • Přemýšlejte o tom, jak lidé věkově zacházejí s věkem. Pokud je někomu 79,9 let, říkáte, že je mu 79 let. Pokud tedy hledáte člověka staršího 79 let, pak hledáte člověka ve věku > 79,99999 let, tj. > = 80 let. Lidé se na věk dívají jako na celá čísla, zaokrouhlují to dolů a každý věk vnímají jako rozsah.

Odpovědět

No , jednoduchá odpověď je, myslím, že vaše implementace nálezu 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, „find“ :

-mtime n
Primární vyhodnotí jako pravdivé, pokud čas modifikace souboru odečtený
od inicializačního času, děleno 86400 (se zbytkem zahozeným), je n.

(Jinde v tomto dokumentu vysvětluje, že n může být ve skutečnosti +n a význam toho jako „větší než“).

Proč standard říká, že se tak bude chovat – no, hádal jsem dlouho v minulosti, že programátor byl líný nebo o tom nepřemýšlel, a právě napsal C code (current_time - file_time) / 86400. C integer arithmetic zahodí zbytek. Skripty začaly v závislosti na tomto chování, a proto bylo standardizováno.

Specifické chování by bylo také přenosné do hypotetického systému, který ukládal pouze datum změny (ne čas). Nevím, jestli takový systém existuje.

Komentáře

  • find byl jasně navržen pouze pro úklidové práce.

Odpověď

Argument -mtime je interpretován jako počet celé dny ve věku souboru. -mtime +n znamená přísně větší než , -mtime -n znamená přísně méně než.

Všimněte si, že s Bashem můžete pracovat intuitivněji:

$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24)) 

najít soubory starší a novější než 24 hodin.

(Je také jednodušší než psát zlomek argumentu -mtime, když chcete rozlišení v hodiny nebo minuty.)

Komentáře

  • Chcete-li vypsat tyto soubory (pouze běžné) ve velikostech čitelných člověkem a v chr onologické pořadí, do $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Toto bude mít stejný účinek také v tom, že oběma těmto příkazům budou stále chybět soubory v jednom minutovém okně před 24 hodinami .
  • $(()) je aritmetická syntaxe prostého prostředí, ‚ není specifická pro Bash, srov. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin Ne , nemusí to být nutně pravda! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Vzhledem k tomu, že Bash je “ rozšířený “ SH, podporuje tuto syntaxi, ale některé jiné skořápky don ‚ t, např csh / tcsh.
  • @ t0r0X, jde o to, že to ‚ není bashismus, funguje spíše v dash a zsh a cokoli jiného slouží jako konvenční /bin/sh.

Odpověď

Zlomková 24hodinová období jsou zkrácena! To znamená, že „find -mtime +1“ říká, aby odpovídalo souborům upraveným před dvěma nebo více dny.

find . -mtime +0 # find files modified greater than 24 hours ago find . -mtime 0 # find files modified between now and 1 day ago # (i.e., in the past 24 hours only) find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0) find . -mtime 1 # find files modified between 24 and 48 hours ago find . -mtime +1 # find files modified more than 48 hours ago 

Následující text může fungovat pouze na GNU?

find . -mmin +5 -mmin -10 # find files modified between # 6 and 9 minutes ago find / -mmin -10 # modified less than 10 minutes ago 

Komentáře

  • Díky, snažil jsem se zjistit, proč -mtime X byl jiný než -mtime + X
  • Domnívám se, že + X znamená zkratky pro (X + 1, X + 2, X + 3, …). 🙂
  • Odkazy na všechny zdrojové dokumenty zaměňují jednoduchou odpověď. Na příkladech záleží. jeho dobrá dokumentace. Pojďme je udělat více! Líbí se mi tato odpověď

Odpověď

-mtime N znamená soubory, jejichž věk A ve dnech splňuje N A < N + 1. Jinými slovy -mtime N vybírá soubory, které byly naposledy upraveny před N a N +1 dny.

-mtime -N znamená soubory, jejichž věk A vyhovuje A < N , tj. Soubory upravené před méně než N dny. Méně intuitivně -mtime +N znamená soubory, jejichž věk A odpovídá N +1 ≤ A , tj. Soubory upraveno alespoň před N +1 dny.

Například -mtime 1 vybere soubory, které byly změněny před 1 až 2 dny. -mtime +1 vybere soubory, které byly upraveny alespoň před 2 dny. Chcete-li soubory upravit alespoň před 1 dnem, použijte -mtime +0.

Popis „byla naposledy upravena před * 24 hodinami“ je pouze přibližný, nikoli velmi jasný.

Pokud si tato pravidla pamatujete těžko, použijte místo toho referenční soubor.

touch -d "1 day ago" cutoff find . -newer cutoff 

(Syntax „ Před 1 dnem “vyžaduje GNU touch.)

Komentáře

  • Pěkné vysvětlení, první 3 odstavce je třeba přidat do dokumentace find!

Odpovědět

Takže pokud je soubor starý 1 den, 23 hodin, 59 minut a 59 sekund, find -mtime +1 to všechno ignoruje a zachází s ním jako s 1 dnem , 0 hodin, 0 minut a 0 sekund staré?

Ano. Jako man find říká: „libovolný zlomková část je ignorována „. Pokud rozdělíte“ 1 den, 23 hodin, 59 minut a 59 sekund „na“ 24 hodin „, můžete získat 1,9999, ale t Část .9999 je poté odstraněna a najednou je soubor starý pouze 1 den.

Odpovědět

Použít -mmin, -amin atd., abyste získali přesné výsledky

Komentáře

  • Argumenty -?min fungují přesně jako -?time argumenty kromě minut namísto dnů. Nejsou ani ‚ t „přesné“.

Odpověď

Pokud chcete přesně 48 hodin staré soubory, ne 2 dny, měli byste do příkazu find přidat --daystart. To vám pomůže.

find . type -f -daystart -mtime +1 

Komentáře

  • Ne, nejprve ‚ s -daystart (přípona GNU), nikoli --daystart. Potom -daystart znamená pouze porovnat časy se začátkem dneška místo aktuálního času, takže --daystart -mtime +1 hlásí soubory, které byly upraveny více že 48 hodin / 2 hodiny před začátkem dneška, takže obvykle soubory, které byly před předvčerem důkladně upraveny.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *