Perché find -mtime +1 restituisce solo file più vecchi di 2 giorni?


117

Sto lottando per capire perché il findinterprete modifica i file volte in questo modo. In particolare, non capisco perché -mtime +1non mostri i file con meno di 48 ore.

Come esempio di test ho creato tre file di test con date modificate diverse:

[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

Ho quindi eseguito find con lo -mtime +1switch e ho ottenuto il seguente output:

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

Ho quindi eseguito find con il -mmin +1440e ho ottenuto il seguente output:

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

Per quanto riguarda la pagina man per trovare, capisco che questo è un comportamento previsto:

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

Questo comunque non ha senso per me. Quindi se un file ha 1 giorno, 23 ore, 59 minuti e 59 secondi, find -mtime +1ignora tutto ciò e lo tratta come se fosse 1 giorno, 0 ore, 0 minuti e 0 secondi? In tal caso, non è tecnicamente più vecchio di quel giorno e ignorato?

... non ... calcola.


7
All'inizio mi è sembrato divertente anche a me, ma se consideri che misura l'età dei file in giorni interi, fa esattamente quello che ti aspetteresti. Non fornirà file uguali a 1 giorno prima. Un file che è int (1.99) giorni non è> 1.
Octopus

Risposte:


87

Bene, la semplice risposta è, immagino, che la tua implementazione di ricerca stia seguendo lo standard POSIX / SuS, che dice che deve comportarsi in questo modo. Citando da SUSv4 / IEEE Std 1003.1, 2013 Edition, "trova" :

-mtime n
     Il primario deve valutare come vero se il tempo di modifica del file sottratto
     dal tempo di inizializzazione, diviso per 86400 (con il resto scartato), è n.

(Altrove in quel documento spiega che npuò effettivamente essere +n, e il significato di ciò come "maggiore di").

Quanto al motivo per lo standard dice che deve comportarsi in questo modo, beh, direi a lungo in passato un programmatore era pigro o non pensarci, e appena scritto il codice C (current_time - file_time) / 86400. L'aritmetica intera C scarta il resto. Gli script sono stati avviati in base a tale comportamento e quindi sono stati standardizzati.

Il comportamento specificato sarebbe anche portatile per un sistema ipotetico che memorizzava solo una data di modifica (non l'ora). Non so se sia esistito un tale sistema.


3
find è stato chiaramente progettato per eseguire solo lavori di pulizia.
Kjeld Flarup,

84

L'argomento a -mtimeviene interpretato come il numero di giorni interi nell'età del file. -mtime +nsignifica strettamente maggiore di , -mtime -nsignifica strettamente inferiore a.

Nota che con Bash puoi fare il più intuitivo:

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

per trovare file più vecchi e più recenti di 24 ore, rispettivamente.

(È anche più facile che digitare un argomento frazionario -mtimeper quando vuoi una risoluzione in ore o minuti.)


2
Per elencare quei file (solo normali) con dimensioni leggibili dall'uomo e in ordine cronologico, fai$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Evgeni Sergeev

1
Ciò avrà anche lo stesso effetto in quanto entrambi quei comandi insieme mancheranno comunque i file all'interno di quella finestra di un minuto 24 ore fa.
Polpo,

1
$(())è una sintassi aritmetica a guscio normale, non è specifica per Bash, cfr. pubs.opengroup.org/onlinepubs/009695399/utilities/…
Josip Rodin

@JosipRodin No, non necessariamente vero! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Poiché Bash è un SH "esteso", supporta questa sintassi, ma alcune altre shell non lo fanno, ad esempio csh / tcsh.
t0r0X,

@ t0r0X il mio punto era che non è un bashismo, piuttosto, funziona in dash e zsh e qualsiasi altra cosa serve come un convenzionale /bin/sh.
Josip Rodin,

45

I periodi frazionari di 24 ore vengono troncati! Ciò significa che "find -mtime +1" dice di corrispondere ai file modificati due o più giorni fa.

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

Quanto segue può funzionare solo su GNU?

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

Grazie, stavo cercando di capire perché -mtime X era diverso da -mtime + X
Vnge

Immagino che + X significhi cortometraggi per (X + 1, X + 2, X + 3, ...). :)
Eric Zheng,

18

Quindi se un file ha 1 giorno, 23 ore, 59 minuti e 59 secondi, trova -mtime +1 ignora tutto ciò e lo tratta come se fosse 1 giorno, 0 ore, 0 minuti e 0 secondi?

Sì. Come man finddice "ogni parte frazionaria viene ignorata". Se dividi "1 giorno, 23 ore, 59 minuti e 59 secondi" per "24 ore", potresti ottenere 1.9999, ma la parte .9999 viene quindi rimossa e improvvisamente il file ha solo 1 giorno.


18

-mtime Nindica file la cui età A in giorni soddisfa NA < N +1. In altre parole, seleziona i file che sono stati modificati l'ultima volta tra N e N +1 giorni fa.-mtime N

-mtime -Nindica file la cui età A soddisfa A < N , ovvero i file modificati meno di N giorni fa. Meno intuitivamente, significa file la cui età A soddisfa N +1 ≤ A , ovvero i file modificati almeno N +1 giorni fa.-mtime +N

Ad esempio, -mtime 1seleziona i file che sono stati modificati tra 1 e 2 giorni fa. -mtime +1seleziona i file che sono stati modificati almeno 2 giorni fa. Per modificare i file almeno 1 giorno fa, utilizzare -mtime +0.

La descrizione "è stata modificata l'ultima volta n * 24 ore fa" è solo un'approssimazione, e non molto chiara.

Se trovi queste regole difficili da ricordare, usa invece un file di riferimento.

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

(La sintassi "1 day ago" richiede GNU touch.)


3
Bella spiegazione, i primi 3 paragrafi dovrebbero essere aggiunti alla documentazione di find!
Melebio

4

Usa -mmin, -amin, ecc per ottenere risultati esatti


6
Gli -?minargomenti funzionano esattamente come gli -?timeargomenti tranne con minuti anziché giorni. Non sono neanche "esatti".
Gilles,

-2

Se vuoi esattamente file di 48 ore, non 2 giorni, allora dovresti aggiungere il --daystarttuo findcomando. Questo ti aiuterà.

find . type -f -daystart -mtime +1

5
No, prima è -daystart(un'estensione GNU), no --daystart. Quindi, -daystartsignifica solo confrontare i tempi con l'inizio di oggi anziché l'ora corrente, quindi --daystart -mtime +1segnaleremmo i file che sono stati modificati più di 48 ore / 2 ore prima dell'inizio di oggi, quindi di solito i file che sono stati modificati in modo brusco prima dell'altro ieri .
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.