Minulla on vaikeuksia kietoa mieleni miksi find tulkitsee tiedoston muokkaus kertaa tapaan kuin se tekee. En ymmärrä, miksi -mtime +1 ei näytä alle 48 tunnin ikäisiä tiedostoja.

Esimerkkitestinä Loin kolme testitiedostoa, joilla oli erilaiset muokatut päivämäärät:

[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 

Suoritin sitten haun -mtime +1 -kytkimellä ja sain seuraava lähtö:

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

Suoritin sitten haun -mmin +1440 -sovelluksella ja sain seuraavan tuloksen:

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

Löydön käsisivun mukaan ymmärrän, että tämä on odotettua käyttäytymistä:

 -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. 

Tällä ei silti ole järkevää minulle. Joten jos tiedosto on 1 päivä, 23 tuntia, 59 minuuttia ja 59 sekuntia vanha, find -mtime +1 jättää kaiken huomiotta ja kohtelee sitä vain sellaisenaan. 1 päivä, 0 tuntia, 0 minuuttia , ja 0 sekuntia vanha? Missä tapauksessa se ei ole teknisesti vanhempi, että 1 päivä ja ohitetaan?

Laskee … ei …

kommentit

  • Aluksi minusta tuntui hassulta, mutta kun katsot, että se mittaa tiedostojen ikää kokonaislukupäivinä, se tekee tarkalleen mitä odotat ’. Se ei ’ anna 1 päivän ikäisiä tiedostoja. Tiedosto, jonka ikä on 1,99 päivää, ei ole > 1.
  • Ajattele, miten ihmiset kohtelevat ikää puhekielellä. Jos joku on 79,9-vuotias, sanot hänen olevan 79-vuotias. Joten jos etsit yli 79-vuotiasta ihmistä, etsit ihmistä, joka on > 79.99999 vuotta vanha eli > = 80 vuotta vanha. Ihmiset tarkastelevat ikää kokonaislukuina ja pyöristävät sen alaspäin ja näkevät jokaisen iän alueena.

Vastaa

No , yksinkertainen vastaus on luultavasti, että löytösi toteutus noudattaa POSIX / SuS-standardia, jonka mukaan sen on toimittava tällä tavalla. Lainaus: SUSv4 / IEEE Std 1003.1, 2013 Edition, ”find” :

-mtime n
Ensisijaisen on arvioitava totta, jos tiedoston muokkausaika, joka on vähennetty alustusajasta jaettuna 86400: lla (jäännös hylätään), on n.

(Muualla siinä asiakirjassa se selittää, että n voi itse asiassa olla +n, ja sen merkitys ”suurempi kuin”).

Miksi standardi sanoo käyttäytyvänsä tuolla tavalla – no, luulen kauan, että ohjelmoija oli laiska tai ei ajatellut sitä, ja kirjoitti vain C koodi (current_time - file_time) / 86400. C-kokonaislukuaritmeettinen hylkää loppuosan. Komentosarjat alkoivat kyseisen käyttäytymisen mukaan ja siten se standardisoitiin.

Spec-d -käyttäytyminen olisi myös kannettava hypoteettiseen järjestelmään, joka tallensi vain muokkauspäivämäärän (ei kellonajan). En tiedä onko tällaista järjestelmää ollut olemassa.

Kommentit

  • löytö on suunniteltu selkeästi vain puhdistustöiden suorittamiseen.

vastaus

Argumentti -mtime tulkitaan kokonaiset päivät tiedoston iässä. -mtime +n tarkoittaa ehdottomasti suurempi kuin , -mtime -n tarkoittaa tiukasti alle.

Huomaa, että Bashilla voit tehdä intuitiivisemman:

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

löytää tiedostot, jotka ovat vanhempia kuin 24 tuntia.

(Se on myös helpompaa kuin kirjoittaa murto-argumentti -mtime, kun haluat tarkkuuden tuntia tai minuuttia.)

Kommentit

  • Luettelemaan ne tiedostot (vain tavalliset), joiden koot ovat luettavissa ja chr onologinen järjestys, tee $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Tällä on myös sama vaikutus, koska molemmat komennot yhdessä kaipaavat edelleen yhden minuutin ikkunan sisällä olevia tiedostoja 24 tuntia sitten .
  • $(()) on tavallinen kuoren aritmeettinen syntakse, se ’ ei ole erityinen Bashille, vrt. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin Ei , ei välttämättä totta! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Koska Bash on ” laajennettu ” SH, se tukee tätä syntaksia, mutta jotkut muut kuoret don ’ t, esim csh / tcsh.
  • @ t0r0X mielestäni se, että se ’ ei ole basismi, se toimii pikemminkin viiva- ja zsh-muodossa ja mikä tahansa muu toimii tavanomaisena /bin/sh.

vastaus

murto-osan 24 tunnin jaksot katkaistaan! Tämä tarkoittaa, että ”find -mtime +1” kertoo vastaavansa tiedostoja, jotka on muokattu vähintään kaksi päivää sitten.

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 

Seuraava voi toimia vain GNU: lla?

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

Kommentit

  • Kiitos, yritin selvittää miksi -mtime X oli erilainen kuin -mtime + X
  • Luulen, että + X tarkoittaa shortseja (X + 1, X + 2, X + 3, …). 🙂
  • linkit kaikkiin lähdeasiakirjoihin sekoittavat yksinkertaisen vastauksen. Esimerkit ovat tärkeitä. sen hyvät asiakirjat. Tehdään enemmän niistä! Pidän tästä vastauksesta.

Vastaus

-mtime N tarkoittaa tiedostoja, joiden ikä A päivinä tyydyttää N A < N + 1. Toisin sanoen -mtime N valitsee tiedostot, joita muokattiin viimeksi N ja N +1 päivää sitten.

-mtime -N tarkoittaa tiedostoja, joiden ikä A täyttää A < N eli tiedostot, joita on muokattu alle N päivää sitten. Vähemmän intuitiivisesti -mtime +N tarkoittaa tiedostoja, joiden ikä A täyttää N +1 ≤ A , eli tiedostoja muokattu vähintään N +1 päivää sitten.

Esimerkiksi -mtime 1 valitsee tiedostot, joita on muokattu 1–2 päivää sitten. -mtime +1 valitsee tiedostot, joita on muokattu vähintään 2 päivää sitten. Jos haluat saada tiedostoja muokattuina vähintään 1 päivä sitten, käytä -mtime +0.

Kuvaus ”viimeksi muokattu n * 24 tuntia sitten” on vain arvio, mutta ei hyvin selkeä.

Jos näitä sääntöjä on vaikea muistaa, käytä sen sijaan viitetiedostoa.

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

(Syntaksi ” 1 päivä sitten ”vaatii GNU touch.)

Kommentit

  • Hieno selitys, 3 ensimmäistä kappaletta tulisi lisätä find!

Vastaus

Joten jos tiedosto on 1 päivä, 23 tuntia, 59 minuuttia ja 59 sekuntia vanha, etsi -mtime +1 jättää kaiken huomiotta ja kohtelee sitä vain sellaisenaan 1 päivä , 0 tuntia, 0 minuuttia ja 0 sekuntia vanha?

Kyllä. Kuten man find sanoo, ”mikä tahansa murto-osa jätetään huomiotta ”. Jos jaat” 1 päivä, 23 tuntia, 59 minuuttia ja 59 sekuntia ”-” 24 tuntia ”, saatat saada 1.9999, mutta t hän .9999-osa riisutaan ja tiedosto on yhtäkkiä vain yhden päivän vanha.

Vastaa

Käytä -mmin, -amin , jne. saadaksesi tarkat tulokset

Kommentit

  • Argumentit -?min toimivat täsmälleen samalla tavalla kuin -?time argumentit paitsi minuuteilla päivien sijaan. Ne eivät ole ’ t ”tarkkoja”.

Vastaa

Jos haluat tarkalleen 48 tuntia vanhoja tiedostoja, ei kahta päivää, sinun on lisättävä --daystart find -komentoon. Tämä auttaa sinua.

find . type -f -daystart -mtime +1 

Kommentit

  • Ei, ensin ’ s -daystart (GNU-laajennus), ei --daystart. Sitten -daystart tarkoittaa vain aikojen vertaamista tämän päivän alkuun nykyisen ajan sijaan, joten --daystart -mtime +1 raportoi muokatuista tiedostoista että 48h / 2 tuntia ennen tämän päivän alkua, joten yleensä tiedostot, joita muokattiin tiukasti ennen eilistä päivää.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *