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