Як отримати дата створення файлу на логічному томі NTFS?


9

Я створив логічний том NTFS у своїй системі Linux для зберігання файлів Windows, тому що я хочу зберегти дату створення моїх файлів (я, мабуть, зафіксував би їх в архіві, а потім розпакував їх, хоча я не маю уявлення, чи буде це працювати). Чи зберігає NTFS-3G дату створення файлів у Linux? Якщо так, то як я можу отримати доступ до нього?

Читаючи цей потік , ОП посилає документацію на 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`

Відповіді:


6

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

Файл NTFS кваліфікується набором чотирьох часових позначок ", що представляють кількість інтервалів 100 наносекунд з 1 січня 1601 (UTC)", хоча UTC не був визначений роками до 1961 року через невідомі зміни обертання землі.

Тут ви знайдете ще більше інформації, зокрема:

Новіші версії NTFS-3g викрити 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-бітове ціле число)
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.