Estoy luchando por entender por qué el find interpreta el archivo tiempos de modificación de la forma en que lo hace. Específicamente, no entiendo por qué -mtime +1 no muestra archivos con menos de 48 horas de antigüedad.

Como prueba de ejemplo Creé tres archivos de prueba con diferentes fechas de modificación:

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

Luego ejecuté find con el -mtime +1 switch y obtuve el siguiente resultado:

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

Luego ejecuté find con -mmin +1440 y obtuve el siguiente resultado:

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

Según la página de manual de find, entiendo que este es el comportamiento esperado:

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

Sin embargo, esto todavía no tiene sentido para mí. Entonces, si un archivo tiene 1 día, 23 horas, 59 minutos y 59 segundos de antigüedad, find -mtime +1 ignora todo eso y simplemente lo trata como si fuera 1 día, 0 horas, 0 minutos. , ¿y 0 segundos? En cuyo caso, técnicamente no es más antiguo que 1 día y se ignora.

No … no … calcula.

Comentarios

  • Al principio también me pareció gracioso, pero cuando consideras que mide la antigüedad de un archivo en días enteros, entonces lo hace exactamente lo que ‘ esperaría. Ganó ‘ t dar archivos con 1 día de antigüedad. Un archivo que tiene int (1.99) días no es > 1.
  • Piense en cómo los humanos tratan a la edad coloquialmente. Si alguien tiene 79,9 años, dices que tiene 79 años. Entonces, si está buscando un humano mayor de 79 años, entonces está buscando un humano que tenga > 79.99999 años, es decir, > = 80 años. La gente mira la edad como números enteros y la redondea hacia abajo y ve cada edad como un rango.

Respuesta

Bueno , la respuesta simple es, supongo, que su implementación de búsqueda sigue el estándar POSIX / SuS, que dice que debe comportarse de esta manera. Citando de SUSv4 / IEEE Std 1003.1, 2013 Edition, «find» :

-mtime n
El primario se evaluará como verdadero si el tiempo de modificación del archivo restado
del tiempo de inicialización, dividido por 86400 (con el resto descartado), es n.

(En otra parte de ese documento se explica que n en realidad puede ser +n, y el significado de eso como «mayor que»).

En cuanto a por qué el estándar dice que se comportará de esa manera, bueno, supongo que hace mucho tiempo un programador era vago o no pensaba en ello, y simplemente escribió el código C código (current_time - file_time) / 86400. La aritmética de enteros en C descarta el resto. Los scripts comenzaron dependiendo de ese comportamiento y, por lo tanto, se estandarizaron.

El comportamiento spec «d también sería portable a un sistema hipotético que solo almacenaba una fecha de modificación (no una hora). No sé si tal sistema ha existido.

Comentarios

  • find fue claramente diseñado para realizar trabajos de limpieza solamente.

Respuesta

El argumento de -mtime se interpreta como el número de días completos en la antigüedad del archivo. -mtime +n significa estrictamente mayor que , -mtime -n significa estrictamente menos que.

Tenga en cuenta que con Bash, puede hacer lo más intuitivo:

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

para buscar archivos anteriores y posteriores a 24 horas, respectivamente.

(También es más fácil que escribir un argumento fraccional en -mtime para cuando desee una resolución en horas o minutos.)

Comentarios

  • Para enumerar esos archivos (solo normales) con tamaños legibles por humanos y en formato chr orden onológico, haga $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • Esto también tendrá el mismo efecto, ya que ambos comandos juntos aún perderán los archivos dentro de esa ventana de un minuto hace 24 horas .
  • $(()) es una sintaxis aritmética de shell simple, ‘ no es específico de Bash, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/…
  • @JosipRodin No , ¡no necesariamente cierto! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Dado que Bash es un » extendido » SH, admite esta sintaxis, pero algunos otros shells no ‘ t, p. ej. csh / tcsh.
  • @ t0r0X mi punto fue que ‘ no es un bashismo, sino que funciona en dash y zsh y cualquier otra cosa sirve como un /bin/sh.

Respuesta

¡Los períodos fraccionarios de 24 horas se truncan! Eso significa que «find -mtime +1» dice que coincide con archivos modificados hace dos o más días.

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 

¿Es posible que lo siguiente solo funcione en GNU?

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

Comentarios

  • Gracias, estaba tratando de averiguar por qué -mtime X era diferente a -mtime + X
  • Me imagino que + X significa cortos para (X + 1, X + 2, X + 3, …). 🙂
  • Los enlaces a todos los documentos fuente confunden la respuesta simple. Los ejemplos importan. su buena documentación. ¡Hagamos más de ellos! Me gusta esta respuesta

Respuesta

-mtime N significa archivos cuyo edad A en días satisface N A < N + 1. En otras palabras, -mtime N selecciona los archivos que se modificaron por última vez entre N y N hace +1 días.

-mtime -N significa archivos cuya antigüedad A satisface A < N , es decir, archivos modificados hace menos de N días. De manera menos intuitiva, -mtime +N significa archivos cuya edad A satisface N +1 ≤ A , es decir, archivos modificado hace al menos N +1 días.

Por ejemplo, -mtime 1 selecciona archivos que se modificaron entre 1 y 2 días atrás. -mtime +1 selecciona archivos que se modificaron hace al menos 2 días. Para obtener archivos modificados hace al menos 1 día, use -mtime +0.

La descripción «se modificó por última vez hace n * 24 horas» es solo una aproximación, y no uno muy claro.

Si encuentra estas reglas difíciles de recordar, use un archivo de referencia en su lugar.

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

(La sintaxis “ Hace 1 día ”requiere GNU touch.)

Comentarios

  • Buena explicación, los primeros 3 párrafos debe agregarse a la documentación de find!

Respuesta

Entonces, si un archivo tiene 1 día, 23 horas, 59 minutos y 59 segundos, find -mtime +1 ignora todo eso y lo trata como si fuera 1 día. , 0 horas, 0 minutos y 0 segundos de antigüedad?

Sí. Como dice man find, «cualquier la parte fraccionaria se ignora «. Si divide» 1 día, 23 horas, 59 minutos y 59 segundos «por» 24 horas «, puede obtener 1,9999, pero t Luego, la parte .9999 se quita y, de repente, el archivo solo tiene 1 día de antigüedad.

Respuesta

Use -mmin, -amin , etc para obtener resultados exactos

Comentarios

  • Los argumentos -?min funcionan exactamente como los -?time argumentos excepto con minutos en lugar de días. Tampoco son ‘ t «exactos».

Responder

Si desea archivos de exactamente 48 horas, no de 2 días, debe agregar --daystart en su comando find. Esto te ayudará.

find . type -f -daystart -mtime +1 

Comentarios

  • No, primero ‘ s -daystart (una extensión GNU), no --daystart. Entonces, -daystart solo significa comparar las horas con el comienzo de hoy en lugar de la hora actual, por lo que --daystart -mtime +1 informaría los archivos que se modificaron más eso 48h / 2 horas antes del comienzo del día de hoy, por lo que generalmente archivos que se modificaron estrictamente antes de anteayer.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *