Faccio fatica a capire perché find
interpreta il file i tempi di modifica come fa. In particolare, non capisco perché -mtime +1
non mostra file meno di 48 ore.
Come esempio di prova Ho creato tre file di test con date di modifica 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 -mtime +1
e ho ottenuto il seguente output:
[root@foobox findtest]# find -mtime +1 ./foo3
Ho quindi eseguito find con -mmin +1440
e ho ottenuto il seguente output:
[root@foobox findtest]# find -mmin +1440 ./foo3 ./foo2
Secondo la pagina man di find, 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 però non ha ancora senso per me. Quindi, se un file ha 1 giorno, 23 ore, 59 minuti e 59 secondi, find -mtime +1
lo ignora e lo considera come se fosse 1 giorno, 0 ore, 0 minuti e 0 secondi? In tal caso, tecnicamente non è più vecchio di 1 giorno e ignorato?
Non … non … calcola.
Commenti
- Allinizio sembrava divertente anche a me, ma se consideri che misura letà di un file in giorni interi, allora lo fa esattamente quello che ‘ ti aspetti. ‘ non fornirà file di 1 giorno di età. Un file vecchio di int (1,99) giorni non è > 1.
- Pensa a come gli esseri umani trattano letà in modo colloquiale. Se qualcuno ha 79,9 anni, dici che ha 79 anni. Quindi, se stai cercando un essere umano di oltre 79 anni, allora stai cercando un essere umano che abbia > 79,99999 anni, ovvero > = 80 anni. Le persone considerano letà come numeri interi, la arrotondano per difetto e vedono ogni età come un intervallo.
Risposta
Bene , la semplice risposta è, immagino, che limplementazione di find stia seguendo lo standard POSIX / SuS, che dice che deve comportarsi in questo modo. Citando da SUSv4 / IEEE Std 1003.1, edizione 2013, “find” :
-mtime n
Il valore primario deve essere considerato vero se lora di modifica del file sottratta
dallora di inizializzazione, divisa per 86400 (con leventuale resto scartato), è n.
(Altrove in quel documento si spiega che n
può effettivamente essere +n
e il significato di ciò come “maggiore di”).
Per quanto riguarda il motivo per cui lo standard dice che si comporterà in quel modo, beh, immagino che molto tempo fa un programmatore fosse pigro o non ci pensasse, e scrisse semplicemente il C code (current_time - file_time) / 86400
. Laritmetica dei numeri interi C ignora il resto. Gli script iniziarono a seconda di quel comportamento, e quindi fu standardizzato.
Anche il comportamento della specifica “d sarebbe portabile a un sistema ipotetico che memorizzava solo una data di modifica (non lora). Non so se un tale sistema sia esistito.
Commenti
- find è stato chiaramente progettato per eseguire solo lavori di pulizia.
Risposta
Largomento di -mtime
è interpretato come il numero di giorni interi nelletà del file. -mtime +n
significa strettamente maggiore di , -mtime -n
significa strettamente minore di.
Nota che con Bash puoi fare il più intuitivo:
$ find . -mmin +$((60*24)) $ find . -mmin -$((60*24))
per trovare rispettivamente file più vecchi e più recenti di 24 ore.
(È anche più facile che digitare un argomento frazionario in -mtime
per quando si desidera la risoluzione in ore o minuti.)
Commenti
- Per elencare quei file (solo normali) con dimensioni leggibili e in chr ordine onologico, esegui
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
- Questo avrà anche lo stesso effetto in quanto entrambi i comandi insieme mancheranno ancora i file allinterno di quella finestra di un minuto 24 ore fa .
-
$(())
è una semplice sintassi aritmetica della shell, ‘ non è specifica di Bash, cfr. pubs.opengroup.org/onlinepubs/009695399/utilities/… - @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 ” esteso ” SH, supporta questa sintassi, ma alcune altre shell non ‘ t, ad es csh / tcsh. - @ t0r0X il mio punto era che ‘ non è un bashismo, piuttosto, funziona in trattino e zsh e qualsiasi altra cosa serve come un convenzionale
/bin/sh
.
Risposta
I periodi frazionari di 24 ore vengono troncati! Ciò significa che “find -mtime +1” indica di trovare una corrispondenza con i 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 potrebbe 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
Commenti
- Grazie, stavo cercando di capire perché -mtime X era diverso da -mtime + X
- Immagino che + X significhi pantaloncini per (X + 1, X + 2, X + 3, …). 🙂
- i collegamenti a tutti i documenti di origine confondono la semplice risposta. Gli esempi contano. la sua buona documentazione. Facciamo di più! Mi piace questa risposta
Risposta
-mtime N
indica i file il cui età A in giorni soddisfa N ≤ A < N + 1. In altre parole, -mtime N
seleziona i file che sono stati modificati lultima volta tra N e N +1 giorni fa.
-mtime -N
indica i file la cui età A soddisfa A < N , ovvero file modificati meno di N giorni fa. In modo meno intuitivo, -mtime +N
indica file la cui età A soddisfa N +1 ≤ A , ovvero file modificato almeno N +1 giorni fa.
Ad esempio, -mtime 1
seleziona i file che sono stati modificati tra 1 e 2 giorni fa. -mtime +1
seleziona i file che sono stati modificati almeno 2 giorni fa. Per ottenere file modificati almeno 1 giorno fa, utilizza -mtime +0
.
La descrizione “è stata modificata lultima volta n * 24 ore fa” è solo unapprossimazione e non molto chiaro.
Se trovi queste regole difficili da ricordare, utilizza invece un file di riferimento.
touch -d "1 day ago" cutoff find . -newer cutoff
(La sintassi ” 1 giorno fa “richiede GNU touch
.)
Commenti
- Bella spiegazione, i primi 3 paragrafi dovrebbe essere aggiunto alla documentazione di
find
!
Answer
Quindi, se un file ha 1 giorno, 23 ore, 59 minuti e 59 secondi, trova -mtime +1 ignora tutto ciò e lo considera come se fosse “s 1 giorno , 0 ore, 0 minuti e 0 secondi?
Sì. Come man find
dice, “any la parte frazionaria viene ignorata “. Se dividi” 1 giorno, 23 ore, 59 minuti e 59 secondi “in” 24 ore “, potresti ottenere 1,9999, ma t La parte .9999 viene quindi rimossa e improvvisamente il file ha solo 1 giorno.
Risposta
Usa -mmin, -amin e così via per ottenere risultati esatti
Commenti
- Gli argomenti
-?min
funzionano esattamente come-?time
argomenti tranne con i minuti anziché i giorni. Non sono nemmeno ‘ “esatti”.
Risposta
Se desideri file vecchi esattamente di 48 ore, non di 2 giorni, devi aggiungere --daystart
al comando find
. Questo ti aiuterà.
find . type -f -daystart -mtime +1
Commenti
- No, prima ‘ s
-daystart
(unestensione GNU), non--daystart
. Quindi,-daystart
significa semplicemente confrontare i tempi con linizio di oggi invece che con lora corrente, quindi--daystart -mtime +1
segnalerebbe i file che sono stati modificati di più 48h / 2 ore prima dellinizio della giornata odierna, quindi di solito i file che sono stati modificati rigorosamente prima dellaltro ieri.