Mă străduiesc să-mi înfășur mintea de ce interpretează fișierul find
modificări de câte ori se întâmplă. În mod specific, nu înțeleg de ce -mtime +1
nu afișează fișiere mai vechi de 48 de ore.
Ca exemplu de testare Am creat trei fișiere de testare cu date modificate diferite:
[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
Am executat apoi find cu comutatorul -mtime +1
și am primit următoarea ieșire:
[root@foobox findtest]# find -mtime +1 ./foo3
Apoi am alergat find cu -mmin +1440
și am obținut următoarea ieșire:
[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2
Conform paginii de manual pentru căutare, înțeleg că acesta este un comportament așteptat:
-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.
Totuși, acest lucru nu are sens pentru mine. Deci, dacă un fișier are o zi, 23 de ore, 59 de minute și 59 de secunde, find -mtime +1
ignoră toate acestea și îl tratează așa cum este 1 zi, 0 ore, 0 minute , și vechi de 0 secunde? În acest caz, nu este mai vechi din punct de vedere tehnic în acea zi și este ignorat?
Nu … nu … calculează.
Comentarii
- La început mi s-a părut amuzant și mie, dar când considerați că măsoară vârsta fișierelor în zile întregi, atunci face exact la ce vă așteptați ‘. ‘ nu va oferi fișiere egale cu 1 zi. Un fișier care are o vechime de 1,99 zile nu este > 1.
- Gândiți-vă la modul în care oamenii tratează vârsta în mod colocvial. Dacă cineva are 79,9 ani, spui că are 79 de ani. Deci, dacă sunteți în căutarea unui om de peste 79 de ani, atunci căutați un om care are > 79.99999 ani, adică > = 80 de ani. Oamenii privesc vârsta ca numere întregi și o rotunjesc în jos și văd fiecare vârstă ca un interval.
Răspuns
Ei bine , răspunsul simplu este, cred, că implementarea căutării dvs. respectă standardul POSIX / SuS, care spune că trebuie să se comporte astfel. Citat din SUSv4 / IEEE Std 1003.1, ediția 2013, „găsiți” :
-mtime n
Primarul va evalua ca fiind adevărat dacă timpul de modificare a fișierului scăzut
din timpul de inițializare, împărțit la 86400 (cu restul aruncat), este n.
(În altă parte a documentului explică faptul că n
poate fi de fapt +n
, iar semnificația acestuia ca „mai mare decât”).
În ceea ce privește motivul pentru care standardul spune că se va comporta așa – bine, aș presupune că în trecut un programator era leneș sau nu se gândea la asta și tocmai a scris C code (current_time - file_time) / 86400
. C aritmetic întreg aruncă restul. Scripturile au început în funcție de comportamentul respectiv și, prin urmare, au fost standardizate.
Comportamentul spec „d ar fi, de asemenea, portabil la un sistem ipotetic care stoca doar o dată de modificare (nu o dată). Nu știu dacă a existat un astfel de sistem.
Comentarii
- găsirea a fost concepută în mod clar pentru a face doar lucrări de curățare.
Răspuns
Argumentul pentru -mtime
este interpretat ca numărul de zile întregi în epoca fișierului. -mtime +n
înseamnă strict mai mare decât , -mtime -n
înseamnă strict mai puțin de.
Rețineți că, cu Bash, puteți face mai intuitiv:
$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24))
pentru a găsi fișiere mai vechi și mai noi de 24 de ore, respectiv.
(Este, de asemenea, mai ușor decât să introduceți un argument fracțional la -mtime
pentru când doriți rezoluție în ore sau minute.)
Comentarii
- Pentru a lista acele fișiere (numai obișnuite) cu dimensiuni care pot fi citite de om și în chr ordine onologică, faceți
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
- Acest lucru va avea, de asemenea, același efect, deoarece ambele comenzi împreună vor pierde fișierele din acea fereastră de un minut în urmă cu 24 de ore .
-
$(())
este sintaxa aritmetică simplă a shell-ului, ea ‘ nu este specifică lui Bash, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/… - @JosipRodin nr , nu neapărat adevărat!
This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Deoarece Bash este un ” extins ” SH, acesta acceptă această sintaxă, dar alte câteva shell-uri nu ‘ t, de ex csh / tcsh. - @ t0r0X ideea mea a fost că ‘ nu este un bashism, mai degrabă, funcționează în liniuță și zsh și orice altceva servește ca un convențional
/bin/sh
.
Răspuns
Perioadele fracționate de 24 de ore sunt trunchiate! Asta înseamnă că „find -mtime +1” spune că se potrivește fișierele modificate acum două sau mai multe zile.
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
Următoarele ar putea funcționa numai pe GNU? p>
find . -mmin +5 -mmin -10 # find files modified between # 6 and 9 minutes ago find / -mmin -10 # modified less than 10 minutes ago
Comentarii
- Mulțumesc, încercam să dau seama de ce -mtime X era diferit de -mtime + X
- Cred că + X înseamnă pantaloni scurți pentru (X + 1, X + 2, X + 3, …). 🙂
- legăturile către toate documentele sursă confundă răspunsul simplu. Exemplele contează. documentația sa bună. Să facem mai multe dintre ele! Îmi place acest răspuns
Răspuns
-mtime N
înseamnă fișiere ale căror vârsta A în zile satisface N ≤ A < N + 1. Cu alte cuvinte, -mtime N
selectează fișierele care au fost modificate ultima dată între N și N + acum 1 zi.
-mtime -N
înseamnă fișiere a căror vârstă A îndeplinește A < N , adică fișiere modificate cu mai puțin de N zile în urmă. Mai puțin intuitiv, -mtime +N
înseamnă fișiere a căror vârstă A îndeplinește N +1 ≤ A , adică fișiere modificat acum cel puțin N +1 zile în urmă.
De exemplu, -mtime 1
selectează fișierele care au fost modificate între 1 și 2 zile în urmă. -mtime +1
selectează fișierele care au fost modificate acum cel puțin 2 zile. Pentru a obține fișiere modificate acum cel puțin o zi, utilizați -mtime +0
.
Descrierea „a fost modificată ultima dată n * cu 24 de ore în urmă” este doar o aproximare și nu una foarte clară.
Dacă vi se par greu de reținut aceste reguli, utilizați în schimb un fișier de referință.
touch -d "1 day ago" cutoff find . -newer cutoff
(Sintaxa „ Acum o zi ”necesită GNU touch
.)
Comentarii
- Bună explicație, primele 3 paragrafe ar trebui adăugat la documentația
find
!
Răspuns
Deci, dacă un fișier are o zi, 23 de ore, 59 de minute și 59 de secunde, găsiți -mtime +1 ignoră toate acestea și îl tratează așa cum este , Vechi de 0 ore, 0 minute și 0 secundă?
Da. Cum man find
spune, „orice partea fracționată este ignorată „. Dacă împărțiți” 1 zi, 23 de ore, 59 de minute și 59 de secunde „până la” 24 de ore „, puteți obține 1,9999, dar t partea .9999 este apoi dezbrăcată și dintr-o dată fișierul are doar o zi.
Răspuns
Utilizați -mmin, -amin , etc pentru a obține rezultate exacte
Comentarii
- Argumentele
-?min
funcționează exact ca-?time
argumente, cu excepția minutelor în loc de zile. Nu sunt ‘ nici „exacte”.
Răspuns
Dacă doriți fișiere vechi de 48 de ore, nu 2 zile, ar trebui să adăugați --daystart
în comanda find
. Acest lucru vă va ajuta.
find . type -f -daystart -mtime +1
Comentarii
- Nu, mai întâi ‘ s
-daystart
(o extensie GNU), nu--daystart
. Apoi,-daystart
înseamnă doar să comparați orele cu începutul zilei de azi în loc de ora curentă, astfel încât--daystart -mtime +1
ar raporta fișierele care au fost modificate cu 48h / 2 ore înainte de începutul zilei de azi, deci, de obicei, fișierele care au fost modificate cu strictețe înainte de alaltăieri.