Как получить дату создания файла на логическом томе NTFS?

9

Я создал логический том NTFS в моей системе Linux для хранения файлов Windows, потому что я хочу сохранить дату создания своих файлов (я бы, вероятно, заархивировал их в архив, а затем разархивировал, хотя понятия не имею, будет ли это работать). Сохраняет ли NTFS-3G дату создания файлов в Linux? Если так, как я могу получить к нему доступ?

Читая эту ветку , OP связывает документацию по NTFS, которая предоставляет сценарий оболочки для поиска даты создания. Я изменил его, пытаясь получить секунды из шестнадцатеричного значения, но я считаю, что я делаю что-то не так:

#!/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
источник

Ответы:

6

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

Файл NTFS определяется набором из четырех временных меток, «представляющих число интервалов в 100 наносекунд с 1 января 1601 года (UTC)», хотя UTC не был определен в течение многих лет до 1961 года из-за неизвестных изменений вращения Земли.

Там вы найдете еще больше информации, в том числе:

Более новые версии ntfs-3g предоставляют атрибут a ntfs.ntfs_crtimeи ntfs.ntfs_crtime_be.

Так:

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

Смотрите также:

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

С более старым ntfs-3g это должно работать:

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

Или с инструментами GNU и точностью до секунды:

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)"
Стефан Шазелас
источник
Ах, я действительно вычитал 11 644 473 600 после того, как отправил этот вопрос, но из-за неправильных интервалов в 100 наносекунд это привело к неверному результату. Я проверю это, когда вернусь к своей коробке.
NobleUplift
Это сработало! Спасибо. Как unpack("Q>")работает? Я читаю документацию по Perl и не совсем понимаю.
NobleUplift
1
@NobleUplift, распаковывает большой порядковый номер (>) [Q] uad (64-битное целое число)
Стефан Шазелас