Come posso ottenere la data di creazione di un file su un volume logico NTFS?


9

Ho creato un volume logico NTFS sul mio sistema Linux per l'archiviazione di file di Windows perché voglio conservare la data di creazione dei miei file (probabilmente li comprimerei in un archivio e poi li decomprimerei, anche se non ho idea se funzionerebbe). NTFS-3G salva la data di creazione dei file su Linux? In tal caso, come posso accedervi?

Leggendo questo thread , l'OP collega la documentazione su NTFS che fornisce uno script di shell per trovare la data di creazione. L'ho modificato nel tentativo di ottenere i secondi dal valore esadecimale, ma credo che sto facendo qualcosa di sbagliato:

#!/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`

Risposte:


6

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

Un file NTFS è qualificato da un insieme di quattro timestamp "che rappresentano il numero di intervalli di 100 nanosecondi dal 1 ° gennaio 1601 (UTC)", sebbene UTC non sia stato definito per anni prima del 1961 a causa di variazioni sconosciute della rotazione terrestre.

Troverai ancora più informazioni lì tra cui:

Le versioni più recenti di ntfs-3g espongono a ntfs.ntfs_crtimee ntfs.ntfs_crtime_beattributo.

Così:

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

Guarda anche:

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

Con ntfs-3g più vecchio, questo dovrebbe funzionare:

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

O con strumenti GNU e precisione sub-second:

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)"

Ah, in realtà stavo sottraendo 11.644.473.600 dopo aver pubblicato questa domanda, ma poiché avevo sbagliato gli intervalli di 100 nanosecondi, si stava ottenendo un risultato non valido. Lo proverò quando torno nella mia scatola.
NobleUplift,

Ha funzionato! Grazie. Come unpack("Q>")funziona? Ho letto il documento Perl e non lo capisco del tutto.
NobleUplift,

1
@NobleUplift, decomprime un big endian (>) [Q] uad (intero a 64 bit)
Stéphane Chazelas
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.