¿Cómo obtengo la fecha de creación de un archivo en un volumen lógico NTFS?

9

Creé un volumen lógico NTFS en mi sistema Linux para el almacenamiento de archivos de Windows porque quiero conservar la fecha de creación de mis archivos (probablemente los comprimiría en un archivo y luego descomprimirlos, aunque no tengo idea de si eso funcionaría). ¿NTFS-3G guarda la fecha de creación de archivos en Linux? Si es así, ¿cómo puedo acceder?

Al leer este hilo , el OP vincula la documentación en NTFS que proporciona un script de shell para encontrar la fecha de creación. Lo modifiqué en un intento de obtener los segundos del valor hexadecimal, pero creo que estoy haciendo algo mal:

#!/bin/sh
CRTIME=`getfattr -h -e hex -n system.ntfs_times $1 | \
    grep '=' | sed -e 's/^.*=\(0x................\).*$/\1/'`
SECONDS=$(($CRTIME / 10000000))
echo `date --date=$SECONDS`
NobleUplift
fuente

Respuestas:

6

Desde https://www.tuxera.com/community/ntfs-3g-advanced/extended-attributes/#filetimes ,

Un archivo NTFS está calificado por un conjunto de cuatro marcas de tiempo "que representan el número de intervalos de 100 nanosegundos desde el 1 de enero de 1601 (UTC)", aunque UTC no se ha definido durante años antes de 1961 debido a variaciones desconocidas de la rotación de la tierra.

Encontrará aún más información allí, incluyendo:

Las versiones más recientes de ntfs-3g exponen a ntfs.ntfs_crtimey ntfs.ntfs_crtime_beatributo.

Entonces:

getfattr --only-values -n system.ntfs_crtime_be /some/file |
  perl -MPOSIX -0777 -ne '$t = unpack("Q>");
  print ctime $t/10000000-11644473600'

Ver también:

ntfsinfo -F /file/in/ntfs /dev/fs-device

Con ntfs-3g anteriores, esto debería funcionar:

getfattr --only-values -n system.ntfs_times /some/file |
  perl -MPOSIX -0777 -ne 'print ctime unpack(Q)/10000000-11644473600'

O con herramientas GNU y precisión por debajo del segundo:

date '+%F %T.%N' -d "@$({ echo 7k
  getfattr --only-values -n system.ntfs_times /some/file |
    od -A n -N 8 -vt u8; echo '10000000/ 11644473600-p'; } |dc)"
Stéphane Chazelas
fuente
Ah, en realidad estaba restando 11,644,473,600 después de publicar esta pregunta, pero debido a que tenía los intervalos de 100 nanosegundos incorrectos, resultó en un resultado no válido. Probaré esto cuando vuelva a mi caja.
NobleUplift
¡Funcionó! Gracias. Como unpack("Q>")funciona Leí el documento de Perl y no lo entiendo del todo.
NobleUplift
1
@NobleUplift, desempaqueta un gran endian (>) [Q] uad (entero de 64 bits)
Stéphane Chazelas