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.