linux - script - ¿Cómo obtener la fecha/hora de creación del archivo en Bash/Debian?
script fecha y hora linux (11)
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.
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 montaje 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
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
}
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.
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 <sys/stat.h> .
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.
La fecha / hora de creación normalmente no se almacena. Entonces no, no puedes.
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.
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
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.
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.
aun mejor:
lsct ()
{
debugfs -R ''stat <''`ls -i "$1" | (read a b;echo -n $a)`''>'' `df "$1" | (read a; read a b; echo "$a")` 2> /dev/null | grep --color=auto crtime | ( read a b c d;
echo $d )
}
lsct / etc
Mié 20 jul 19:25:48 2016
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