Igyekszem átgondolni az elmém miért a find értelmezi a fájlt a módosítás időtartama. Pontosabban nem értem, hogy a -mtime +1 miért nem jeleníti meg a 48 óránál fiatalabb fájlokat.

Példaként teszt Három tesztfájlt hoztam létre, különböző módosított dátumokkal:

[[email protected] 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 

Ezután lefuttattam a keresést a -mtime +1 kapcsolóval, és megkaptam a következő kimenet:

[[email protected] findtest]# find -mtime +1 ./foo3 

Ezután lefuttattam a keresést a -mmin +1440 paranccsal, és a következő kimenetet kaptam:

[[email protected] findtest]# find -mmin +1440 ./foo3 ./foo2 

A keresési kézikönyv szerint tudom, hogy ez várható viselkedés:

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

Ennek még mindig nincs értelme számomra. Tehát, ha egy fájl 1 nap, 23 óra, 59 perc és 59 másodperc régi, find -mtime +1 mindezt figyelmen kívül hagyja, és csak így kezeli “1 nap, 0 óra, 0 perc , és 0 másodpercig? Ebben az esetben technikailag nem idősebb az 1 nap, és figyelmen kívül hagyja?

Nem … nem … számol.

Megjegyzések

  • Eleinte nekem is viccesnek tűnt, de ha belegondolunk, hogy egy fájl korát egész napokban méri, akkor pontosan amire ‘ számíthat. Nem fog ‘ adni egy napos fájlokat. Az int (1,99) napos fájl nem > 1.
  • Gondoljon arra, hogy az emberek hogyan viszonyulnak az életkorhoz köznyelven. Ha valaki 79,9 éves, akkor azt mondja, hogy 79 éves. Tehát, ha 79 évesnél idősebb embert keres, akkor olyan embert keres, aki > 79,99999 éves, azaz > = 80 éves. Az emberek egész korként tekintenek az életkorra, és lefelé kerekítik, és az egyes korokat tartománynak tekintik.

Válasz

Nos , azt hiszem, az egyszerű válasz az, hogy a keresés megvalósítása a POSIX / SuS szabványt követi, amely szerint így kell viselkednie. Idézet a következőből: SUSv4 / IEEE Std 1003.1, 2013 Edition, “find” :

-mtime n
Az elsődlegesnek akkor kell igaznak lennie, ha a fájlmódosítási idő kivonva az inicializálási időből, osztva 86400-mal (a maradékot elvetve), n.

(A dokumentum egy másik részében megmagyarázza, hogy a n valóban +n lehet, és ennek jelentése “nagyobb, mint”).

Miért mondja a szabvány, hogy így kell viselkednie – nos, azt hiszem, régen egy programozó lusta volt, vagy nem gondolt rá, és csak megírta a C kód: (current_time - file_time) / 86400. A C egész számtani szám elveti a maradékot. A parancsfájlok ettől a viselkedéstől függően indultak el, és így szabványosították.

A spec “d viselkedés szintén hordozható lenne hipotetikus rendszerhez, amely csak módosítási dátumot (nem időt) tárolt. Nem tudom, létezett-e ilyen rendszer.

Megjegyzések

  • a find egyértelműen csak takarítási munkák elvégzésére készült.

Válasz

A -mtime argumentum a egész nap a fájl korában. -mtime +n jelentése: szigorúan nagyobb, mint , -mtime -n jelentése: szigorúan kevesebb, mint.

Ne feledje, hogy a Bash használatával az intuitívabb műveleteket végezheti:

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

hogy megtalálja a 24 óránál régebbi és újabb fájlokat.

(Az is könnyebb, mint egy töredékes argumentum beírása -mtime -re, ha felbontást akar órák vagy percek.)

Megjegyzések

  • Az (csak normál) fájlok felsorolása ember által olvasható méretben és chr-ben onológiai sorrend, tegye a $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Ez ugyanazt a hatást fejti ki, hogy mindkét parancs együttesen továbbra is hiányolja az egy perces ablakban lévő fájlokat 24 órával ezelőtt .
  • $(()) sima héjszámtani szintaxis, ‘ nem specifikus a Bash számára, vö. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin Nem , nem feltétlenül igaz! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Mivel Bash ” kiterjesztett ” SH, támogatja ezt a szintaxist, de néhány más héj don ‘ t, pl csh / tcsh.
  • @ t0r0X az volt a véleményem, hogy ‘ nem bashizmus, inkább kötőjelben és zsh-ben működik, és bármi más konvencionálisan is szolgál /bin/sh.

Válasz

A töredékes 24 órás periódusok meg vannak csonkítva! Ez azt jelenti, hogy a „find -mtime +1” azt mondja, hogy megfeleljen a két vagy több napja módosított fájloknak.

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 

A következők csak a GNU-n működhetnek?

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

Megjegyzések

  • Köszönöm, próbáltam rájönni, miért különbözik az -mtime X, mint a -mtime + X
  • Úgy gondolom, hogy a + X rövidítést jelent (X + 1, X + 2, X + 3, …) számára. 🙂
  • az összes forrásdokumentumra mutató link megzavarja az egyszerű választ. A példák számítanak. annak jó dokumentációja. Tegyünk többet belőlük! Tetszik ez a válasz

Válasz

-mtime N olyan fájlokat jelent, amelyek az életkor A napokban kielégíti a N A < N + 1. Más szóval, a -mtime N kiválasztja azokat a fájlokat, amelyeket utoljára N és N +1 napja módosítottak.

-mtime -N olyan fájlokat jelent, amelyek A kora kielégíti A < N azaz kevesebb, mint N nappal ezelőtt módosított fájlok. Kevésbé intuitív módon a -mtime +N olyan fájlokat jelent, amelyek A kora kielégíti az N +1 ≤ A -t, azaz fájlokat legalább N +1 napja módosítva.

Például a -mtime 1 kiválasztja azokat a fájlokat, amelyeket 1 és 2 nappal ezelőtt módosítottak. -mtime +1 kiválasztja azokat a fájlokat, amelyeket legalább 2 napja módosítottak. Ha legalább egy napja módosított fájlokat szeretne kapni, használja a következőt: -mtime +0.

A „legutóbb n * 24 órája módosították” leírás csak hozzávetőleges, és nem nagyon világos.

Ha ezeket a szabályokat nehéz megjegyezni, használjon referenciafájlt.

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

(A szintaxis ” 1 napja ”szükséges a GNU touch.)

Megjegyzések

  • Szép magyarázat, az első 3 bekezdés hozzá kell adni a find!

Válasz

Tehát ha egy fájl 1 nap, 23 óra, 59 perc és 59 másodperc régi, akkor a -mtime +1 keresés mindezt figyelmen kívül hagyja, és csak úgy kezeli , 0 óra, 0 perc és 0 másodperc régi?

Igen. Mint man find, “bármelyik töredékes rész figyelmen kívül marad A .9999 részt ezután lecsupaszítják, és hirtelen a fájl csak 1 napos lesz.

Válasz

Használja -mmin, -amin , stb a pontos eredmények eléréséhez

Megjegyzések

  • Az -?min argumentumok pontosan úgy működnek, mint a -?time argumentumok, kivéve napok helyett perceket. Ők sem ‘ sem „pontosak”.

Válasz

Ha pontosan 48 órás fájlokat szeretnél, nem pedig 2 napokat, akkor adj hozzá --daystart -t a find parancsodba. Ez segít Önnek.

find . type -f -daystart -mtime +1 

Megjegyzések

  • Nem, először ‘ s -daystart (egy GNU kiterjesztés), nem pedig --daystart. Ezután a -daystart azt jelenti, hogy összehasonlítja az időket a mai nappal a jelenlegi idő helyett, így a --daystart -mtime +1 a módosított fájlokat jelentené 48 óra / 2 órával a mai nap kezdete előtt, tehát általában azokat a fájlokat, amelyeket tegnapelőtt szigorúan módosítottak.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük