Wie erhalte ich das Erstellungsdatum einer Datei auf einem logischen NTFS-Volume?

9

Ich habe auf meinem Linux-System ein logisches NTFS-Volume für den Windows-Dateispeicher erstellt, weil ich das Erstellungsdatum meiner Dateien beibehalten möchte (ich würde sie wahrscheinlich in ein Archiv komprimieren und dann entpacken, obwohl ich keine Ahnung habe, ob dies funktionieren würde). Speichert NTFS-3G das Erstellungsdatum von Dateien unter Linux? Wenn ja, wie greife ich darauf zu?

Beim Lesen dieses Threads verknüpft das OP die Dokumentation zu NTFS, die ein Shell-Skript zum Ermitteln des Erstellungsdatums bereitstellt. Ich habe es geändert, um die Sekunden aus dem Hex-Wert zu ermitteln, aber ich glaube, dass ich etwas falsch mache:

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

Antworten:

6

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

Eine NTFS-Datei wird durch einen Satz von vier Zeitstempeln qualifiziert, die „die Anzahl der 100-Nanosekunden-Intervalle seit dem 1. Januar 1601 (UTC) darstellen“, obwohl UTC aufgrund unbekannter Variationen der Erdrotation seit Jahren vor 1961 nicht definiert wurde.

Dort finden Sie noch mehr Informationen, darunter:

Neuere Versionen von ntfs-3g machen ein ntfs.ntfs_crtimeund ntfs.ntfs_crtime_be-Attribut verfügbar .

So:

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

Siehe auch:

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

Bei älteren ntfs-3g sollte dies funktionieren:

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

Oder mit GNU-Werkzeugen und einer Genauigkeit von weniger als einer Sekunde:

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
quelle
Ah, ich habe tatsächlich 11.644.473.600 subtrahiert, nachdem ich diese Frage gestellt hatte, aber weil ich die 100-Nanosekunden-Intervalle falsch hatte, führte dies zu einem ungültigen Ergebnis. Ich werde das testen, wenn ich wieder in meiner Box bin.
NobleUplift
Es funktionierte! Vielen Dank. Wie funktioniert das unpack("Q>")? Ich habe das Perl-Dokument gelesen und verstehe es nicht ganz.
NobleUplift
1
@ NobleUplift, entpackt ein Big Endian (>) [Q] uad (64-Bit-Ganzzahl)
Stéphane Chazelas