2009-09-10 30 views
19

os.stat devuelve los atributos st_mtime y st_ctime, el tiempo de modificación es st_mtime y st_ctime "change time" en POSIX. ¿hay alguna función que devuelva la hora de creación de un archivo usando python y bajo Linux?Obtener tiempo de creación de archivos con Python en linux

+0

Esto funcionó para mí: http://stackoverflow.com/a/947239/4535020 – Tbb

+1

Parece que depende de qué sistema de archivos que utilice: http://unix.stackexchange.com/questions/7562/what -file-systems-on-linux-store-the-creation-time – CSJ

Respuesta

25

You probablycan't.:

3,1) ¿Cómo encuentro el tiempo de creación de un archivo?

No puede, no está almacenado en ninguna parte. Los archivos tienen un tiempo de última modificación (mostrado por "ls -l"), un último tiempo de acceso (mostrado por "ls -lu") y un tiempo de cambio de inodo (mostrado por "ls -lc"). Este último suele ser denominado "tiempo de creación", incluso en algunas páginas del manual, , pero eso es incorrecto; también se establece mediante operaciones como mv, ln, chmod, chown y chgrp.

La página de manual de "stat (2)" discute esto.

+0

Entonces, ¿hay un comando para encontrar la hora y la fecha de creación de un archivo en Linux Si stat no lo hace? –

+5

En general, los sistemas de archivos UNIX no almacenan tiempo de creación en absoluto; no hay un método para recuperar datos que nunca se escribieron en el disco en primer lugar. – ephemient

13

intento:

st_birthtime 

Se isnt' garantizados para estar disponible en todos los sistemas sin embargo. A partir de los documentos:

En algunos sistemas Unix (como Linux), los siguientes atributos también pueden ser disponibles: st_blocks (número de bloques asignados para el archivo), st_blksize (tamaño de bloque del sistema de ficheros), st_rdev (tipo del dispositivo si es un dispositivo inodo). st_flags (banderas definidas por el usuario para el archivo ).

En otros sistemas Unix (como FreeBSD), los siguientes atributos pueden estar disponible (pero sólo pueden ser llenado si la raíz intenta utilizarlos): st_gen (número de generación de archivos), st_birthtime (hora de creación de archivos).

http://docs.python.org/2/library/os.html#os.stat

1

Se podría explicar por qué quiere hacer esto.

Una solución indirecta podría ser utilizar algún sistema revision control (a.k.a., sistema de control de versiones = VCS) para administrar los archivos cuyo tiempo de nacimiento es necesario.

Así que podría usar git en dichos archivos (es decir, manejarlos como "código fuente"). Entonces sabrá no solo cuándo se han creado (de hecho registrados en el VCS usando git add), sino por qué, por quién, para qué, etc. ... Use git log para obtener todo esto ...

Por supuesto que usted de alguna manera necesidad de educar a los usuarios a utilizar un VCS como git

1

de acuerdo con un hilo hereHFS de OS X y NTFS de Microsoft también tanto un seguimiento de la hora de nacimiento, y me han dicho el OS X y versiones de Cygwin de stat() devuelve esta información la que mirar el osx stat manpage parece correcta, al menos para Mac:

a, m, C, B

El archivo momento en que se accedió por última vez o modificado, cuando el nodo-i fue cambiado por última vez, o el tiempo de nacimiento del inodo.

para Linux más nuevos sistemas de archivos como ext4, Btrfs y JFS hacen apoyar esta usando debugfs, hay una función fiesta tomado de here que extraerá la fecha creados por el sello de tiempo:

Es posible recuperar el archivo fecha de creación, si usted se ocupa de sistema de archivos EXT4 como capaces - sistema de archivos de diario para Linux:

marcas de tiempo mejoradas

... Ext4 ofrece marcas de tiempo medidos en nanosegundos. Además, ext4 también agrega soporte para marcas de tiempo creadas por fecha. Pero no hay consenso en la comunidad sobre eso así que

... como señala Theodore Ts'o, mientras que es fácil agregar un campo de fecha de creación adicional en el inodo (lo que permite técnicamente el soporte para fecha creada timestamps en ext4), es más difícil modificar o agregar las llamadas al sistema necesarias, como stat() (que probablemente requeriría una nueva versión) y las diferentes bibliotecas que dependen de ellas (como glibc). Estos cambios requerirían la coordinación de muchos proyectos. Entonces, incluso si los desarrolladores de ext4 implementan soporte inicial para las marcas de tiempo de fecha de creación, esta función no estará disponible para los programas de usuario por el momento. Que termina con la cotización final de Linus

Esperemos cinco años y veamos si realmente hay consenso sobre que se necesita y se usa en absoluto, en lugar de apresurarse en algo simplemente porque "podemos".

xstat() { 
    for target in "${@}"; do 
    inode=$(ls -di "${target}" | cut -d ' ' -f 1) 
    fs=$(df "${target}" | tail -1 | awk '{print $1}') 
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*') 
    printf "%s\t%s\n" "${crtime}" "${target}" 
    done 
} 

Correr devuelve la fecha de creación:

:~$ echo 'print("hello world")' > blah.py 
:~$ xstat "blah.py" 
Mon Jul 6 13:43:39 2015 blah.py 
:~$ echo 'print("goodbye world")' > blah.py 
:~$ xstat "blah.py" 
Mon Jul 6 13:43:39 2015 blah.py 

Así que a menos que el sistema de archivos compatible con él, entonces no es posible, si el sistema de archivos hace entonces se podría ejecutar el debugfs usando subproceso y analizar la salida.

0

Ciertos sistemas de archivos admiten la grabación de la hora de nacimiento, pero Linux no proporciona una interfaz para obtenerla.

Ver http://lwn.net/Articles/397442/

Si uno atempts utilizar el comando "stat" para obtenerlo: % stat -c% w {archivo o directorio}

El resultado será un "-" debido a las no tiene la capacidad de recuperarlo. Sin embargo, se puede utilizar este método muestra la utilización de debugfs con xstat para recuperarlo (siempre de nuevo, que el sistema de archivos está utilizando soportes recolectarla.)

https://gist.github.com/moiseevigor/8c496f632137605b322e

xstat() { 
    for target in "${@}"; do 
    inode=$(ls -di "${target}" | cut -d ' ' -f 1) 
    fs=$(df "${target}" | tail -1 | awk '{print $1}') 
    crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
    grep -oP 'crtime.*--\s*\K.*') 
    printf "%s\t%s\n" "${crtime}" "${target}" 
    done 
} 

Nota esto requiere sudo.

0

¿Qué quiere decir que no se puede hacer [1]? La función,

os.stat(path).st_birthtime
, funciona muy bien.

 
[1]: 
Somebody said that it couldn’t be done 
     But he with a chuckle replied 
That “maybe it couldn’t,” but he would be one 
     Who wouldn’t say so till he’d tried. 
So he buckled right in with the trace of a grin 
     On his face. If he worried he hid it. 
He started to sing as he tackled the thing 
     That couldn’t be done, and he did it! 
-- Edgar Albert Guest 
+0

¿Qué es eso? Tu respuesta es confusa – Billa

Cuestiones relacionadas