Bagaimana cara mendapatkan tanggal pembuatan file pada volume logis NTFS?

9

Saya membuat volume logis NTFS pada sistem Linux saya untuk penyimpanan file Windows karena saya ingin mempertahankan tanggal pembuatan file-file saya (saya mungkin akan zip mereka ke dalam arsip dan kemudian unzip, meskipun saya tidak tahu apakah itu akan berhasil). Apakah NTFS-3G menyimpan tanggal pembuatan file di Linux? Jika demikian, bagaimana cara mengaksesnya?

Membaca utas ini , dokumentasi tautan OP pada NTFS yang menyediakan skrip shell untuk menemukan tanggal pembuatan. Saya memodifikasinya sebagai upaya untuk mendapatkan detik dari nilai hex, tetapi saya percaya bahwa saya melakukan sesuatu yang salah:

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

Jawaban:

6

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

File NTFS dikualifikasikan oleh satu set perangko waktu “mewakili jumlah interval 100 nanodetik sejak 1 Januari 1601 (UTC)”, meskipun UTC belum ditentukan untuk tahun sebelum 1961 karena variasi rotasi bumi yang tidak diketahui.

Anda akan menemukan lebih banyak informasi di sana termasuk:

Versi ntfs-3g yang lebih baru mengekspos a ntfs.ntfs_crtimedan ntfs.ntfs_crtime_beatribut.

Begitu:

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

Lihat juga:

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

Dengan ntfs-3g yang lebih tua, ini seharusnya bekerja:

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

Atau dengan alat GNU dan presisi sub-detik:

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
sumber
Ah, saya benar-benar mengurangi 11.644.473.600 setelah saya memposting pertanyaan ini, tetapi karena saya memiliki interval 100-nanosecond yang salah itu menghasilkan hasil yang tidak valid. Saya akan menguji ini ketika saya kembali ke kotak saya.
NobleUplift
Berhasil! Terima kasih. Bagaimana cara unpack("Q>")kerjanya? Saya membaca dokumen Perl dan saya tidak sepenuhnya memahaminya.
NobleUplift
1
@NobleUplift, membongkar endian besar (>) [Q] uad (integer 64bit)
Stéphane Chazelas