Quiero comprobar en linux bash si un archivo se creó hace más de x veces.
digamos que el archivo se llama text.txt y el tiempo es de 2 horas.
if [ what? ]
then
echo "old enough"
fi
linux
bash
command-line
flybywire
fuente
fuente
find
devolvió un valor distinto de cero cuando no se encontraron coincidencias.text.txt
se presume que no es un directorio.[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Siempre me gustó usar
date -r /the/file +%s
para encontrar su edad.También puede hacer
touch --date '2015-10-10 9:55' /tmp/file
para obtener una hora extremadamente precisa en una fecha / hora arbitraria.fuente
let AGE=$(($(date +%s)-$(date -r /path/to/file +%s)))
[con el supuesto de que se creó y nunca se modificó, o "edad relativa a la modificación"]function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
$[ ]
es, si no obsoleta , al menos antiguo y menos portátil , y se debería usar$(( ))
en su lugar; y las comillas inversas son más frágiles que$( )
; Además, es posible que los guiones en los nombres de las funciones no sean completamente portátiles. ¡Sin embargo, la esencia es buena!Usando el
stat
para averiguar la fecha de la última modificación del archivo,date
para averiguar la hora actual y un uso liberal de bashisms, uno puede hacer la prueba que desee en función de la última hora de modificación del archivo 1 .Si bien el código es un poco menos legible que el
find
enfoque, creo que es un enfoque mejor que ejecutarlofind
para ver un archivo que ya "encontró". Además, la manipulación de fechas es divertida ;-)%Z
lugar de a%Y
continuación para obtener el "tiempo de cambio", que puede ser el que desee.[Actualizar]
Para usuarios de mac, use en
stat -f "%m" $somefile
lugar de la sintaxis específica de Linux anteriorfuente
stat
no está incorporado - muy mal de mi parte, lo arreglaré.El tiempo de creación no se almacena.
Lo que se almacena son tres marcas de tiempo (generalmente, se pueden desactivar en ciertos sistemas de archivos o mediante ciertas opciones del sistema de archivos):
un "Cambio" en el archivo se cuenta como cambios de permiso, cambio de nombre, etc. Mientras que la modificación es solo contenido.
fuente
Aunque ctime no es técnicamente el momento de la creación, con bastante frecuencia lo es.
Dado que ctime no se ve afectado por los cambios en el contenido del archivo, generalmente solo se actualiza cuando se crea el archivo. Y sí, puedo escucharlos a todos gritar, también se actualiza si cambian los permisos de acceso o la propiedad ... pero generalmente eso es algo que se hace una vez, generalmente al mismo tiempo que coloca el archivo allí.
Personalmente siempre uso mtime para todo, e imagino que eso es lo que quieres. Pero de todos modos ... aquí hay una repetición de la fiesta "poco atractiva" de Guss, en una función fácil de usar.
fuente
local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime")
superuser.com/questions/427551/…chmod
, aplicado en el archivo, anulará esa idea. Pero puedo vivir contigo haciendo eso ;-)+%s
de la segunda mitadage() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); }
(¡Gracias a @Grizly por la corrección!)noatime
opción (lo cual es bueno para el rendimiento, por lo que debe usarlo). Así que usa en%X
lugar de%Y
.Encontrar uno es bueno, pero creo que puede usarlo de otra manera, especialmente si necesita saber cuántos segundos es el archivo antiguo.
date -d "now - $( stat -c "%Y" $filename ) seconds" +%s
usando la fecha GNU
fuente
Considere el resultado de la herramienta 'stat':
Puede ver aquí las tres fechas para acceder / modificar / cambiar. No hay fecha de creación. Solo puede estar realmente seguro cuando se modificó el contenido del archivo (el campo "modificar") o se cambió su inodo (el campo "cambiar").
Ejemplos de cuándo se actualizan ambos campos:
"Modificar" se actualizará si alguien concatena información adicional al final del archivo.
"Cambiar" se actualizará si alguien cambia los permisos a través de chmod.
fuente
yo suelo
fuente