¿Cómo verificar todas las marcas de tiempo de un archivo?

52

¿Hay un comando en Linux para verificar todas las marcas de tiempo de un archivo?

Estoy tratando de ver las últimas fechas modificadas, creadas y tocadas en el archivo.

Mechaflash
fuente
44
Solo para señalar, los archivos de Linux no tienen fechas de nacimiento. Por lo tanto, no es posible determinar la fecha en que se creó un archivo.
FatalError
noté que = (. Gracias por señalarme.
Mechaflash
44
@FatalError: varios sistemas de archivos ya admiten marcas de tiempo de nacimiento / creación; El verdadero problema es acceder a dicha información adicional. (No se puede extender struct statsin romper cosas, desafortunadamente ...) Puede probar debugfs -R "stat <1234>" /dev/sdXYext4, reemplazando 1234con un ino.
Grawity
@grawity: ¡Genial! Siempre me pregunté por qué no tenía fs ... pero supongo que sí, pero como dijiste, no puedes simplemente romper el ABI para los binarios existentes. Gracias por el consejo :).
FatalError
1
@FatalError, la hora de nacimiento se puede mostrar con el statcomando de Linux , consulte ¿Cómo encontrar la fecha de creación del archivo? y ¿Qué sistemas de archivos en Linux almacenan el tiempo de creación? .
Franklin Piat

Respuestas:

73

El comando se llama stat.

$ stat test
234881026 41570368 -rw-r--r-- 1 werner staff 0 0 "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" 4096 0 0 test

Si desea ajustar el formato, consulte las páginas de manual, ya que la salida es específica del sistema operativo y varía en Linux / Unix.

En general, también puede obtener los tiempos a través de un listado de directorio normal:

  • ls -l la última vez que se modificó el contenido del archivo, el mtime
  • ls -lcmuestra la última vez que se modificó el estado del archivo, el ctime( ¿Cuál es la diferencia? )
  • ls -luproduce el último tiempo de acceso, el atime(aunque la utilidad de este concepto está sujeta a discusión )

Y, por supuesto, ctimeno registra cuándo se "creó" un archivo. La especificación POSIX define solo tres marcas de tiempo, pero algunos sistemas de archivos de Linux almacenan el tiempo de nacimiento / tiempo de creación. ¿Cómo encontrar la fecha de creación del archivo? En una configuración tan compatible, uno podría usar

stat --printf '%n\nmtime: %y\nctime: %z\natime: %x\ncrtime:%w\n'
slhck
fuente
statEs realmente detallado. Pero lssolo necesita una línea. Sería bueno si también pudiera mostrar segundos. Sin embargo, al crear listas de archivos, el primero es perfectamente adecuado.
neverMind9
ls -l era la solución rápida para mí
Andrew
Me di cuenta de que el resultado de ls -lpuede mostrar un formato de fecha diferente cuando hay instalado BusyBox (en Android). Creo que sin eso, es como "2019-07-26 14:41", y con eso, es como "6 de mayo 21:27". ¿Cómo es que falta el año? ¿Hay alguna manera de forzarlo usando el formato de sin él?
Desarrollador de Android
@androiddeveloper Como dije, la respuesta depende del sistema operativo. Creo que deberías abrir una nueva pregunta. Si está hablando específicamente de Android, tal vez Stack Overflow o entusiastas de Android serían más adecuados.
slhck
@slhck Bueno, es el mismo sistema operativo, solo que con BusyBox instalado. Le pregunté si es posible (es decir: hay un comando para usar) para obtener el formato que se mostrará.
desarrollador de Android
21

Solo hay TRES valores de tiempos distintos almacenados para cada uno de sus archivos, según lo define el Estándar POSIX : http://pubs.opengroup.org/onlinepubs/9699919799/ (consulte la sección Definiciones básicas -> 4. Conceptos generales -> 4.8 Archivo Times Update)

Cada archivo tiene tres marcas de tiempo asociadas distintas: la hora del último acceso a datos , la hora de la última modificación de datos y la hora en que el estado del archivo cambió por última vez . Estos valores se devuelven en la estructura de estructura de características del archivo, como se describe en <sys / stat.h> .

Y de <sys / stat.h> :

atime is for Last data access timestamp.
mtime is for Last data modification timestamp.
ctime is for Last file status change timestamp.

Los siguientes ejemplos muestran la diferencia entre atime , mtime y ctime , estos ejemplos están en GNU / Linux BASH. Puede usarlo stat -xen Mac OS X u otro BSD Dist. para ver el formato de salida similar.

$ stat --version
stat (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ touch test
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:58:28.609223953 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

Cuando se acaba de crear el archivo, tres marcas de tiempo son iguales.


1. atime

Primero, accedamos a los datos del archivo leyéndolos ( lesso vim), imprimiéndolos ( cat) o copiándolos a otro archivo ( cp).

$ cat test #Nothing will be printed out, since the file is empty
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800  <-- atime Changed!
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

2. ctime

Ahora cambiemos el estado del archivo, cambiando el permiso ( chmod) o renombrándolo ( mv)

$ chmod u+x test
$ stat stet
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:04:10.178285430 +0800  <-- ctime Changed!
$    
$ mv test testing
$ stat testing
  File: `testing'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:06:33.342207679 +0800  <-- ctime Changed again!

Tenga en cuenta que hasta ahora, el contenido ( datos ) del archivo sigue siendo el mismo que cuando se creó.


3. mtime

Finalmente, modifiquemos el contenido del archivo editando el archivo.

$ echo 'Modify the DATA of the file' > testing
$ echo 'Modify the DATA of the file also change the file status' > testing
$ stat testing
  File: `testing'
  Size: 56          Blocks: 8          IO Block: 4096   regular file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 11:09:48.247345148 +0800  <-- mtime Changed!
Change: 2014-03-16 11:09:48.247345148 +0800  <-- ctime also Changed!

4. hora de nacimiento

También tenga en cuenta que la versión más reciente de stat(p. Ej., stat --version 8.13En Ubuntu 12.04) tiene la información de la cuarta marca de tiempo: la hora de nacimiento (hora de creación del archivo). Aunque puede no mostrar la hora correcta por ahora:

$ stat --version
stat (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ stat birth_time
  File: `birth_time'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 4073946     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ bingyao)   Gid: ( 1000/ bingyao)
Access: 2014-03-16 10:46:48.838718970 +0800
Modify: 2014-03-16 10:46:48.838718970 +0800
Change: 2014-03-16 10:46:48.838718970 +0800
 Birth: -
YaOzI
fuente
¿Cuál es el significado de 10: 46: 48.838718970? HH: MM: SS. nanosegundos?
Dzung Nguyen
2
. "Desde el kernel 2.5.48, la estructura estadística admite una resolución de nanosegundos para los tres campos de marca de tiempo de archivo ..."
Tom Lord
El tiempo de creación se puede calcular con acceso de raíz y depuración si es necesario: moiseevigor.github.io/software/2015/01/30/…
Mikko Rantalainen
2
Hora de nacimiento ... con mucho gusto. Porque la última modificación y el último cambio es casi para el mismo propósito pero aún distinto. Es bueno si los cuatro existen.
neverMind9