Comment obtenir la date de création d'un fichier sur un volume logique NTFS?

9

J'ai créé un volume logique NTFS sur mon système Linux pour le stockage de fichiers Windows parce que je veux conserver la date de création de mes fichiers (je les compresserais probablement dans une archive puis les décompresser, bien que je ne sache pas si cela fonctionnerait). NTFS-3G enregistre-t-il la date de création des fichiers sous Linux? Si oui, comment y accéder?

En lisant ce fil , l'OP relie la documentation sur NTFS qui fournit un script shell pour trouver la date de création. Je l'ai modifié pour essayer d'obtenir les secondes de la valeur hexadécimale, mais je pense que je fais quelque chose de 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
la source

Réponses:

6

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

Un fichier NTFS est qualifié par un ensemble de quatre horodatages "représentant le nombre d'intervalles de 100 nanosecondes depuis le 1er janvier 1601 (UTC)", bien que l'UTC n'ait pas été défini pendant des années avant 1961 en raison de variations inconnues de la rotation de la Terre.

Vous y trouverez encore plus d'informations, notamment:

Les versions plus récentes de ntfs-3g exposent un attribut ntfs.ntfs_crtimeet ntfs.ntfs_crtime_be.

Donc:

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

Voir également:

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

Avec les anciens ntfs-3g, cela devrait fonctionner:

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

Ou avec des outils GNU et une précision inférieure à la seconde:

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
la source
Ah, en fait, je soustrais 11 644 473 600 après avoir posté cette question, mais parce que j'avais des intervalles de 100 nanosecondes erronés, cela entraînait un résultat invalide. Je testerai cela quand je reviendrai dans ma boîte.
NobleUplift
Ça a marché! Merci. Comment ça unpack("Q>")marche? J'ai lu le document Perl et je ne le comprends pas entièrement.
NobleUplift
1
@NobleUplift, décompresse un gros endian (>) [Q] uad (entier 64 bits)
Stéphane Chazelas