¿Cómo obtener la fecha / hora de creación del archivo en Bash / Debian?

Estoy usando Bash en Debian GNU / Linux 6.0. ¿Es posible obtener la fecha / hora de creación del archivo? No es la fecha / hora de la modificación. ls -lh a.txt y stat -c %y a.txt solo dan la hora de modificación.

Desafortunadamente, su búsqueda no será posible en general, ya que solo hay 3 valores de tiempo distintos almacenados para cada uno de sus archivos, tal como se define en el estándar POSIX (consulte la sección 4.8 Definiciones de bases, Actualización de tiempos de archivos ).

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 se modificó por última vez el estado del archivo. Estos valores se devuelven en la estructura de características del archivo struct stat , como se describe en .

EDITAR: Como se menciona en los comentarios a continuación, dependiendo del sistema de archivos utilizado, los metadatos pueden contener la fecha de creación del archivo. Sin embargo, tenga en cuenta que el almacenamiento de información como esa no es estándar. Dependiendo de esto, puede llevar a problemas de portabilidad al trasladarse a otro sistema de archivos, en caso de que el que realmente se usa de alguna manera lo almacene de todos modos.

 ls -i file #output is for me 68551981 debugfs -R 'stat <68551981>' /dev/sda3 # /dev/sda3 is the disk on which the file exists #results - crtime value [root@loft9156 ~]# debugfs -R 'stat <68551981>' /dev/sda3 debugfs 1.41.12 (17-May-2010) Inode: 68551981 Type: regular Mode: 0644 Flags: 0x80000 Generation: 769802755 Version: 0x00000000:00000001 User: 0 Group: 0 Size: 38973440 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 76128 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013 atime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013 mtime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013 **crtime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013** Size of extra inode fields: 28 EXTENTS: (0-511): 352633728-352634239, (512-1023): 352634368-352634879, (1024-2047): 288392192-288393215, (2048-4095): 355803136-355805183, (4096-6143): 357941248-357943295, (6144 -9514): 357961728-357965098 

La respuesta de mikyra es buena. El hecho es como lo que dijo.

 [jason@rh5 test]$ stat test.txt File: `test.txt' Size: 0 Blocks: 8 IO Block: 4096 regular empty file Device: 802h/2050d Inode: 588720 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 500/ jason) Gid: ( 500/ jason) Access: 2013-03-14 01:58:12.000000000 -0700 Modify: 2013-03-14 01:58:12.000000000 -0700 Change: 2013-03-14 01:58:12.000000000 -0700 

Si desea verificar qué archivo se creó primero, puede estructurar su nombre de archivo añadiendo la fecha del sistema cuando cree una serie de archivos.

Tenga en cuenta que si tiene su sistema de archivos montado con noatime por razones de rendimiento, entonces el tiempo probablemente muestre la hora de creación. Dado que noatime genera un aumento de rendimiento masivo (al eliminar un disco de escritura cada vez que se lee un archivo), puede ser una opción de configuración sensata que también le ofrece los resultados que desea.

La fecha / hora de creación normalmente no se almacena. Entonces no, no puedes.

ls -i menus.xml

94490 menus.xml Aquí el número 94490 representa el inode

Entonces haz un:

df -h

 Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg-root 4.0G 3.4G 408M 90% / tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/sda1 124M 27M 92M 23% /boot /dev/mapper/vg-var 7.9G 1.1G 6.5G 15% /var 

Para encontrar el punto de assembly del sistema de archivos raíz “/”, porque el archivo menus.xml está en ‘/’ que es ‘/ dev / mapper / vg-root’

debugfs -R ‘stat <94490>‘ / dev / mapper / vg-root

El resultado puede ser como el siguiente:

debugfs -R ‘stat <94490>‘ / dev / mapper / vg-root

 debugfs 1.41.12 (17-May-2010) Inode: 94490 Type: regular Mode: 0644 Flags: 0x0 Generation: 2826123170 Version: 0x00000000 User: 0 Group: 0 Size: 4441 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 16 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013 atime: 0x5266e47b -- Wed Oct 23 09:47:55 2013 mtime: 0x5266e438 -- Wed Oct 23 09:46:48 2013 Size of extra inode fields: 4 Extended attributes stored in inode body: selinux = "unconfined_u:object_r:usr_t:s0\000" (31) BLOCKS: (0-1):375818-375819 TOTAL: 2 

Donde puedes ver el tiempo de creación:

 ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013 

Puede encontrar el tiempo de creación, también conocido como tiempo de nacimiento, usando stat y también haciendo coincidir usando find .
Tenemos estos archivos que muestran la última hora de modificación:

 $ ls -l --time-style=long-iso | sort -k6 total 692 -rwxrwx---+ 1 XXXX XXXX 249159 2013-05-31 14:47 Getting Started.pdf -rwxrwx---+ 1 XXXX XXXX 275799 2013-12-30 21:12 TheScienceofGettingRich.pdf -rwxrwx---+ 1 XXXX XXXX 25600 2015-05-07 18:52 Thumbs.db -rwxrwx---+ 1 XXXX XXXX 148051 2015-05-07 18:55 AsAManThinketh.pdf 

Para buscar archivos creados dentro de un marco de tiempo determinado usando find como a continuación.
Claramente, el sistema de archivos sabe sobre la hora de nacimiento de un archivo:

 $ find -newerBt '2014-06-13' ! -newerBt '2014-06-13 12:16:10' -ls 20547673299906851 148 -rwxrwx--- 1 XXXX XXXX 148051 May 7 18:55 ./AsAManThinketh.pdf 1407374883582246 244 -rwxrwx--- 1 XXXX XXXX 249159 May 31 2013 ./Getting\ Started.pdf 

Podemos confirmar esto usando estadísticas:

 $ stat -c "%w %n" * | sort 2014-06-13 12:16:03.873778400 +0100 AsAManThinketh.pdf 2014-06-13 12:16:04.006872500 +0100 Getting Started.pdf 2014-06-13 12:16:29.607075500 +0100 TheScienceofGettingRich.pdf 2015-05-07 18:32:26.938446200 +0100 Thumbs.db 

las páginas de Stat Man explica% w:

 %w time of file birth, human-readable; - if unknown 

Como explicó @mikyra, el tiempo de la fecha de creación no se almacena en ningún lado.

Todos los métodos anteriores son agradables, pero si quiere obtener rápidamente la última fecha de modificación, puede escribir:

 ls -lit /path 

con la opción -t enumera todos los archivos en / ruta ordenados por la última fecha de modificación.

Si realmente quieres lograr eso, puedes usar un vigilante de archivos como inotifywait .

Miras un directorio y guardas información sobre creaciones de archivos en archivos separados fuera de ese directorio.

 while true; do change=$(inotifywait -e close_write,moved_to,create .) change=${change#./ * } if [ "$change" = ".*" ]; then ./scriptToStoreInfoAboutFile; fi done 

Como no se almacena tiempo de creación, puede construir su propio sistema basado en inotify.

Citado de https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347 , el siguiente shellscript funcionaría para obtener el tiempo de creación:

 get_crtime() { for target in "${@}"; do inode=$(stat -c %i "${target}") 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" "${target}" "${crtime}" done } 

aun mejor:

 lsct () { debugfs -R 'stat <'`ls -i "$1" | (read ab;echo -n $a)`'>' `df "$1" | (read a; read ab; echo "$a")` 2> /dev/null | grep --color=auto crtime | ( read abcd; echo $d ) } 

lsct / etc

Mié 20 jul 19:25:48 2016