Jeg sliter med å pakke tankene mine rundt hvorfor find tolker filen modifisering ganger slik den gjør. Spesielt forstår jeg ikke hvorfor -mtime +1 ikke viser filer som er mindre enn 48 timer gamle.

Som et eksempel på en test Jeg opprettet tre testfiler med forskjellige modifiserte datoer:

[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 

Jeg løp deretter finne med -mtime +1 -bryteren og fikk følgende utgang:

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

Jeg løp deretter finne med -mmin +1440 og fikk følgende utgang:

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

I henhold til mansiden for finne, forstår jeg at dette er forventet oppførsel:

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

Dette er fortsatt ikke fornuftig for meg. Så hvis en fil er 1 dag, 23 timer, 59 minutter og 59 sekunder gammel, ignorerer find -mtime +1 alt det og bare behandler det som det er 1 dag, 0 timer, 0 minutter , og 0 sekunder gammel? I så fall er den ikke teknisk eldre den ene dagen og ignorert?

Beregner … ikke …

Kommentarer

  • Først virket det også morsomt for meg, men når du tenker på at det måler en filalder på hele dager, gjør det nøyaktig hva du ‘ forventer. Det ga ‘ t filer som er lik 1 dag gamle. En fil som er int (1,99) dager gammel er ikke > 1.
  • Tenk på hvordan mennesker behandler alderen daglig. Hvis noen er 79,9 år, sier du at de er 79 år. Så hvis du leter etter et menneske over 79 år, så leter du etter et menneske som er > 79.99999 år gammel dvs. > = 80 år gammel. Folk ser på alderen som heltall og runder den ned og ser hver alder som et område.

Svar

Vel , det enkle svaret er, antar jeg, at din funnimplementering følger POSIX / SuS-standarden, som sier at den må oppføre seg slik. Sitat fra SUSv4 / IEEE Std 1003.1, 2013 Edition, «find» :

-mtime n
Primæren skal evalueres som sant om filendringstiden trukket
fra initialiseringstiden, delt på 86400 (med eventuell restkassering), er n.

(Et annet sted i dette dokumentet forklarer det at n faktisk kan være +n, og betydningen av det som «større enn»).

Når det gjelder hvorfor standarden sier at den skal oppføre seg slik – vel, jeg antar lenge før en programmerer var lat eller ikke tenkte på det, og bare skrev C kode (current_time - file_time) / 86400. Heltalsberegning forkaster resten. Skript startet avhengig av atferden, og dermed ble den standardisert.

Spesifikasjonen ville også være bærbar til et hypotetisk system som bare lagret en modifikasjonsdato (ikke tid). Jeg vet ikke om et slikt system har eksistert.

Kommentarer

  • finne var tydelig designet for kun å gjøre oppryddingsjobber.

Svar

Argumentet til -mtime tolkes som antallet hele dager i filens alder. -mtime +n betyr strengt større enn , -mtime -n betyr strengt mindre enn.

Merk at med Bash kan du gjøre det mer intuitivt:

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

for å finne filer eldre og nyere enn henholdsvis 24 timer.

(Det er også lettere enn å skrive inn et brøkargument til -mtime for når du vil ha oppløsning i timer eller minutter.)

Kommentarer

  • For å liste opp filene (bare vanlig) med lesbare størrelser og i chr onologisk rekkefølge, gjør $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Dette vil også ha samme effekt ved at begge disse kommandoene sammen fortsatt vil savne filene i det ene minuttsvinduet for 24 timer siden .
  • $(()) er vanlig skallaritmetisk syntaks, den ‘ er ikke spesifikk for Bash, jfr. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin No , ikke nødvendigvis sant! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Siden Bash er en » utvidet » SH, støtter den denne syntaksen, men noen andre skall ikke ‘ t, f.eks csh / tcsh.
  • @ t0r0X poenget mitt var at det ‘ ikke er en basisme, det fungerer heller i dash og zsh og hva som helst annet fungerer som en konvensjonell /bin/sh.

Svar

Brøkdelte 24-timersperioder er avkortet! Det betyr at «find -mtime +1» sier for å matche filer som ble endret for to eller flere dager siden.

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ølgende fungerer kanskje bare 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

  • Takk, jeg prøvde å finne ut hvorfor -mtime X var annerledes enn -mtime + X
  • Jeg regner med at + X betyr shorts for (X + 1, X + 2, X + 3, …). 🙂
  • lenker til alle kildedokumentene forvirrer det enkle svaret. Eksempler betyr noe. den gode dokumentasjonen. La oss gjøre flere av dem! Jeg liker dette svaret

Svar

-mtime N betyr filer hvis alder A i dager tilfredsstiller N A < N + 1. Med andre ord, -mtime N velger filer som sist ble endret mellom N og N for +1 dager siden.

-mtime -N betyr filer hvis alder A tilfredsstiller A < N , dvs. filer endret for mindre enn N dager siden. Mindre intuitivt betyr -mtime +N filer hvis alder A tilfredsstiller N +1 ≤ A , dvs. filer endret for minst N for +1 dager siden.

For eksempel velger -mtime 1 filer som ble endret for 1 til 2 dager siden. -mtime +1 velger filer som ble endret for minst to dager siden. For å få filer endret for minst 1 dag siden, bruk -mtime +0.

Beskrivelsen “ble sist endret n * 24 timer siden” er bare en tilnærming, og ikke en veldig klar.

Hvis du synes det er vanskelig å huske disse reglene, kan du bruke en referansefil i stedet.

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

(Syntaksen “ For 1 dag siden ”krever GNU touch.)

Kommentarer

  • Fin forklaring, de tre første avsnittene bør legges til i dokumentasjonen til find!

Svar

Så hvis en fil er 1 dag, 23 timer, 59 minutter og 59 sekunder gammel, finn -mtime +1 ignorerer alt det og bare behandler det som det er 1 dag , 0 timer, 0 minutter og 0 sekunder gamle?

Ja. Som man find sier, «noen brøkdel blir ignorert «. Hvis du deler» 1 dag, 23 timer, 59 minutter og 59 sekunder «gjennom» 24 timer «, kan du få 1,9999, men t han .9999-delen blir deretter strippet og plutselig er filen bare 1 dag gammel.

Svar

Bruk -mmin, -amin osv. for å få eksakte resultater

Kommentarer

  • -?min -argumentene fungerer akkurat som -?time argumenter unntatt med minutter i stedet for dager. De er ikke heller ‘ t. «

Svar

Hvis du vil ha nøyaktig 48 timer gamle filer, ikke to dager, bør du legge til --daystart i find -kommandoen. Dette vil hjelpe deg.

find . type -f -daystart -mtime +1 

Kommentarer

  • Nei, først ‘ s -daystart (en GNU-utvidelse), ikke --daystart. Så betyr -daystart å sammenligne tider med begynnelsen av i dag i stedet for nåværende tid, så --daystart -mtime +1 rapporterer filer som ble endret mer det 48t / 2 timer før begynnelsen av i dag, så vanligvis ble filer som ble modifisert strengt før i går.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *