2009-02-16 5 views

Respuesta

95

Sólo para el tiempo de modificación

if test `find "text.txt" -mmin +120` 
then 
    echo old enough 
fi 

O, lo mismo en una línea:

#!/bin/bash 
find text.txt -mmin +120 -exec echo "old enough" \; 

Puede utilizar -cmin para el cambio o -amin de tiempo de acceso. Como señalaron otros, no creo que puedas rastrear el tiempo de creación.

+1

puede soltar 'test' y los backticks. Esto es análogo a 'if (test == true)' vs 'if (test)' – guns

+3

@guns: no, no puedes. – kmkaplan

+2

Estás en lo correcto; Supongo que estaba pensando que 'find' devolvió un valor distinto de cero cuando no se encontraron coincidencias. – guns

15

El tiempo de creación no se almacena.

Lo que se almacenan son tres marcas de tiempo (por lo general, pueden ser desactivados en ciertos sistemas de archivos o por ciertas opciones del sistema de archivos):

  • hora del último acceso
  • tiempo Última modificación
  • tiempo del último cambio

a "Cambiar" al archivo se cuenta como cambios de permisos, cambio de nombre, etc. Si bien la modificación solo tiene contenido.

3

examinar los resultados de la herramienta 'stat':

File: `infolog.txt' 
    Size: 694   Blocks: 8   IO Block: 4096 regular file 
Device: 801h/2049d Inode: 11635578 Links: 1 
Access: (0644/-rw-r--r--) Uid: (1000/  fdr) Gid: (1000/  fdr) 
Access: 2009-01-01 22:04:15.000000000 -0800 
Modify: 2009-01-01 22:05:05.000000000 -0800 
Change: 2009-01-01 22:05:05.000000000 -0800 

Se puede ver aquí las tres fechas para el Acceso/modificar/cambio. No hay fecha de creación . Solo puede estar realmente seguro cuando el contenido del archivo fue modificado (el campo "modificar") o su inodo cambiado (el campo "cambiar" ).

ejemplos de cuando ambos campos se actualizan:

"Modificar" se actualizarán si alguien concatenada información adicional a el final del archivo.

"Cambio" se actualizará si alguien ha cambiado los permisos a través de chmod.

+0

concedió, stat puede decir tu información relevante. Pero será bastante tedioso analizar para obtener lo que queremos. – PypeBros

10

Utilizando el stat de averiguar la fecha de la última modificación del archivo, date de averiguar la hora actual y un uso liberal de bash, se puede hacer la prueba que desee sobre la base de la última fecha de modificación del archivo .

if [ "$(($(date +"%s") - $(stat -c "%Y" $somefile)))" -gt "7200" ]; then 
    echo "$somefile is older then 2 hours" 
fi 

Mientras que el código es un poco menos legible entonces el enfoque find, creo que es una mejor aproximación a continuación, ejecutar find mirar un archivo que ya se "encontró".Además, la manipulación de la fecha es divertido ;-)


  1. Como no se registra el tiempo de creación Phil señalado correctamente, pero el uso de %Z en lugar de %Y abajo para obtener "tiempo de cambio", que puede ser lo que quieres.

[Actualización]

para usuarios de Mac, utilice stat -f "%m" $somefile en lugar de la sintaxis específica de Linux anterior

+0

¿A qué shell están incorporados la fecha y la estadística? Mi bash (GNU, 3.2.48) no los tiene. –

+0

Vaya, disculpe. 'stat' no está incorporado, muy mal de mi parte, lo arreglaré. – Guss

+0

@ tommy.carstensen - No tengo un mac disponible. ¿Puedes describir lo que no funciona? Además, ¿estás usando bash? Sé que muchas Macistas prefieren zsh. – Guss

11

Aunque ctime no técnicamente es el momento de la creación, que es muy a menudo.

Como ctime no se ve afectado por cambios en el contenido del archivo, por lo general solo se actualiza cuando se crea el archivo. Y sí, puedo oírte gritar, también se actualiza si cambias los permisos de acceso o la propiedad ... pero en general es algo que se hace una vez, generalmente al mismo tiempo que pones el archivo allí.

Personalmente siempre uso mtime para todo, y me imagino que eso es lo que quieres. Pero de todos modos ... aquí hay una repetición de "poco atractivo" de Guss, en una función fácil de usar.

 
#!/bin/bash 
function age() { 
    local filename=$1 
    local changed=`stat -c %Y "$filename"` 
    local now=`date +%s` 
    local elapsed 

    let elapsed=now-changed 
    echo $elapsed 
} 

file="/" 
echo The age of $file is $(age "$file") seconds. 
+0

Esto fue útil, pero no funcionó de inmediato para OSX porque la estadística se implementa de manera diferente. La única forma compatible con sistemas cruzados que encontré fue usar Perl. La secuencia de comandos debería funcionar en Mac si reemplaza la línea correspondiente con esto: 'local changed = $ (perl -MFile :: stat -e" print stat (\ "$ {filename} \") -> mtime ")' http://superuser.com/questions/427551/is-there-a-cross-nix-compatible-way-to-get-file-modified-timestamp –

+1

El "tiempo de creación" es un concepto difícil de comprender. ¿Qué significa para un archivo copiado? ¿Qué pasa con un archivo movido? ¿Qué pasa si se movió a través del borde de un dispositivo (por lo que se creó de nuevo, en cierto sentido)? ¿Qué significa para un archivo empaquetado y luego no empaquetado? Varias respuestas son posibles aquí y no existe consenso. Sin embargo, mencionar el ctime es bueno, pero no lo situaría semánticamente cerca del concepto vago de un "tiempo de creación". Especialmente dado que un simple 'chmod', aplicado en el archivo, anulará esa idea. Pero puedo vivir con * you * haciendo eso ;-) – Alfe

+0

@Alfe: Te estás perdiendo el '+% s' de la segunda mitad – Grizly

30

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 un tiempo extremadamente fino en una fecha/hora arbitraria.

+0

Estaba buscando lo mismo hoy. ¡Mejor! – Neutralizer

+0

Gracias. Aterricé en esta pregunta SO porque busqué en Google "cómo imprimir la edad de archivo bash". ¡Así que esto es exactamente lo que estaba buscando! –

+1

Gracias! con la única advertencia de que lo anterior es una marca de tiempo (no edad) pero se puede usar para calcular la edad como 'let AGE = $ (($ (date +% s) - $ (date -r/path/to/file +% s))) '[con la suposición de que se creó y nunca se modificó, o" edad relativa al mod "] – nhed

5

el hallazgo uno es bueno, pero creo que se puede utilizar anotherway, especialmente si necesita ahora cuántos segundos es el archivo antiguo

date -d "now - $(stat -c "%Y" $filename) seconds" +%s

usando fecha GNU

+0

No funciona en Mac. –

+0

use gstat, "prepare coreutils" –

+0

@ erik-johansson No tengo derechos de administrador. –

Cuestiones relacionadas