Jag kämpar för att tänka på varför find tolkar filen modifiering gånger så som det gör. Specifikt förstår jag inte varför -mtime +1 inte visar filer som är mindre än 48 timmar gamla.

Som ett exempel test Jag skapade tre testfiler med olika modifierade datum:

[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 

Jag sprang sedan hitta med -mtime +1 -brytaren och fick följande utdata:

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

Jag sprang sedan hitta med -mmin +1440 och fick följande utdata:

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

Enligt man-sidan för hitta förstår jag att detta är förväntat beteende:

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

Det här är ändå inte meningsfullt för mig. Så om en fil är 1 dag, 23 timmar, 59 minuter och 59 sekunder gammal ignorerar find -mtime +1 allt detta och behandlar det bara som det är 1 dag, 0 timmar, 0 minuter och 0 sekunder gammal? I vilket fall är den inte tekniskt äldre den en dag och ignoreras?

Beräknar … inte …

Kommentarer

  • Först verkade det också roligt för mig, men när man tänker att det mäter en filålder i heldagar, gör det exakt vad du ’ förväntar dig. Det vann ’ att inte ge filer som är lika med en dag gamla. En fil som är int (1,99) dagar gammal är inte > 1.
  • Tänk på hur människor behandlar ålder i allmänhet. Om någon är 79,9 år säger du att de är 79 år. Så om du letar efter en människa över 79 år, letar du efter en människa som är > 79.99999 år gammal dvs > = 80 år gammal. Människor ser åldern som heltal och rundar ner den och ser varje ålder som ett intervall.

Svar

Tja , det enkla svaret är, antar jag, att din sökimplementering följer POSIX / SuS-standarden, som säger att den måste bete sig så. Citat från SUSv4 / IEEE Std 1003.1, 2013 Edition, ”find” :

-mtime n
Primären ska utvärderas som sant om tiden för filändring subtraherad
från initialiseringstiden, dividerad med 86400 (med eventuell återstod som kasseras), är n.

(Annars i det dokumentet förklarar det att n faktiskt kan vara +n, och innebörden av det som ”större än”).

Varför standarden säger att den ska bete sig på det sättet – ja, jag antar att länge tidigare var en programmerare lat eller inte tänkte på det och skrev bara C kod (current_time - file_time) / 86400. Heltal aritmetik kasserar resten. Skript startade beroende på det beteendet och därför standardiserades det.

Specifikationen skulle också vara bärbar till ett hypotetiskt system som bara lagrade ett modifieringsdatum (inte tid). Jag vet inte om ett sådant system har existerat.

Kommentarer

  • fynd var tydligt utformat för att bara göra upprensningsjobb.

Svar

Argumentet till -mtime tolkas som antalet hela dagar i filens ålder. -mtime +n betyder strikt större än , -mtime -n betyder strikt mindre än.

Observera att med Bash kan du göra det mer intuitivt:

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

för att hitta filer som är äldre respektive nyare än 24 timmar.

(Det är också lättare än att skriva in ett fraktionerat argument till -mtime för när du vill ha upplösning i timmar eller minuter.)

Kommentarer

  • För att lista dessa filer (endast vanliga) med läsbara storlekar och i chr onologisk ordning, gör $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Detta kommer också att ha samma effekt genom att båda kommandona tillsammans fortfarande kommer att sakna filerna i det ena minutsfönstret för 24 timmar sedan .
  • $(()) är enkel skal-aritmetisk syntax, den ’ är inte specifik för Bash, jfr. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin No , inte nödvändigtvis sant! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Eftersom Bash är en ” utökad ” SH stöder den denna syntax, men vissa andra skal inte ’ t, t.ex. csh / tcsh.
  • @ t0r0X min poäng var att det ’ inte är en basism, snarare fungerar det i streck och zsh och vad som helst fungerar som en konventionell /bin/sh.

Svar

Fraktionerade 24-timmarsperioder är avkortade! Det betyder att ”find -mtime +1” säger för att matcha filer som ändrats för två eller flera dagar sedan.

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 

Följande kanske bara fungerar på GNU?

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

Kommentarer

  • Tack, jag försökte ta reda på varför -mtime X var annorlunda än -mtime + X
  • Jag räknar med att + X betyder shorts för (X + 1, X + 2, X + 3, …). 🙂
  • länkar till alla källdokument förvirrar det enkla svaret. Exempel betyder något. dess goda dokumentation. Låt oss göra fler av dem! Jag gillar det här svaret

Svar

-mtime N betyder filer vars ålder A i dagar uppfyller N A < N + 1. Med andra ord väljer -mtime N filer som senast ändrades mellan N och N för +1 dagar sedan.

-mtime -N betyder filer vars ålder A uppfyller A < N , dvs. filer som har ändrats för mindre än N dagar sedan. Mindre intuitivt betyder -mtime +N filer vars ålder A uppfyller N +1 ≤ A , dvs. filer ändrad för minst N för +1 dagar sedan.

Till exempel väljer -mtime 1 filer som ändrades för 1 till 2 dagar sedan. -mtime +1 väljer filer som ändrades för minst två dagar sedan. För att få filer ändrade för minst 1 dag sedan, använd -mtime +0.

Beskrivningen ”modifierades senast n * för 24 timmar sedan” är bara en ungefärlig uppskattning och inte en mycket tydlig.

Om det är svårt att komma ihåg dessa regler, använd en referensfil istället.

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

(Syntaxen ” 1 dag sedan ”kräver GNU touch.)

Kommentarer

  • Fin förklaring, de första 3 styckena bör läggas till i dokumentationen för find!

Svar

Så om en fil är 1 dag, 23 timmar, 59 minuter och 59 sekunder gammal, hittar -mtime +1 ignorerar allt detta och behandlar det bara som det är 1 dag , 0 timmar, 0 minuter och 0 sekunder gamla?

Ja. Som man find säger, ”någon bråkdel ignoreras ”. Om du delar” 1 dag, 23 timmar, 59 minuter och 59 sekunder ”genom” 24 timmar ”kan du få 1,9999, men t han .9999-delen strippas sedan och plötsligt är filen bara 1 dag gammal.

Svar

Använd -mmin, -amin , etc för att få exakta resultat

Kommentarer

  • -?min -argumenten fungerar precis som -?time argument utom med minuter istället för dagar. De är inte heller ’ t ”exakt”.

Svar

Om du vill ha exakt 48 timmar gamla filer, inte två dagar, ska du lägga till --daystart i kommandot find. Detta hjälper dig.

find . type -f -daystart -mtime +1 

Kommentarer

  • Nej, först ’ s -daystart (ett GNU-tillägg), inte --daystart. Då betyder -daystart att jämföra tider med början av idag istället för aktuell tid, så --daystart -mtime +1 skulle rapportera filer som ändrats mer det 48h / 2 timmar före början av idag, så vanligtvis filer som ändrades strikt före i går.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *