Jak uzyskać datę utworzenia pliku na woluminie logicznym NTFS?


9

Utworzyłem wolumin logiczny NTFS w moim systemie Linux do przechowywania plików Windows, ponieważ chcę zachować datę utworzenia moich plików (prawdopodobnie spakowałbym je do archiwum, a następnie rozpakowałem, choć nie mam pojęcia, czy to zadziała). Czy NTFS-3G zapisuje datę utworzenia plików w systemie Linux? Jeśli tak, jak mogę uzyskać do niego dostęp?

Czytając ten wątek , OP łączy dokumentację NTFS, która zawiera skrypt powłoki do znalezienia daty utworzenia. Zmodyfikowałem to, próbując uzyskać sekundy z wartości szesnastkowej, ale wierzę, że robię coś złego:

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

Odpowiedzi:


6

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

Plik NTFS jest kwalifikowany przez zestaw czterech znaczników czasu „reprezentujących liczbę odstępów 100 nanosekund od 1 stycznia 1601 r. (UTC)”, chociaż UTC nie został zdefiniowany na lata przed 1961 r. Z powodu nieznanych odmian obrotu Ziemi.

Znajdziesz tam jeszcze więcej informacji, w tym:

Nowsze wersje ntfs-3g ujawniają atrybuty ntfs.ntfs_crtimei ntfs.ntfs_crtime_be.

Więc:

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

Zobacz też:

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

W przypadku starszych ntfs-3g powinno to działać:

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

Lub z narzędziami GNU i precyzją poniżej sekundy:

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

Ach, właściwie odejmowałem 11 644 473 600 po tym, jak opublikowałem to pytanie, ale ponieważ miałem błędne odstępy 100 nanosekund, spowodowało to niepoprawny wynik. Przetestuję to, kiedy wrócę do mojego pudełka.
— NobleUplift,

Zadziałało! Dzięki. Jak unpack("Q>")działa Czytam dokument Perla i nie do końca go rozumiem.
— NobleUplift,

1
@NobleUplift, rozpakowuje duży endian (>) [Q] uad (liczba całkowita 64-bitowa)
— Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.