NTFS論理ボリューム上のファイルの作成日を取得するにはどうすればよいですか?


9

LinuxシステムにWindowsファイルストレージ用のNTFS論理ボリュームを作成しました。これは、ファイルの作成日を保持したいためです(おそらくアーカイブに圧縮してから解凍しますが、うまくいくかどうかはわかりません)。NTFS-3GはLinux上のファイルの作成日を保存しますか?もしそうなら、どうすればそれにアクセスできますか?

このスレッドを読むと、OPはNTFSのドキュメントを作成し、作成日を見つけるためのシェルスクリプトを提供します。16進値から秒を取得するために変更しましたが、何か間違っていると思います。

#!/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ファイルは、「1601年1月1日(UTC)からの100ナノ秒間隔の数を表す」4つのタイムスタンプのセットによって修飾されますが、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ツールと1秒未満の精度:

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 2013

動いた!ありがとう。どのように機能しunpack("Q>")ますか?Perlのドキュメントを読みましたが、完全には理解していません。
NobleUplift 2013

1
@NobleUpliftは、ビッグエンディアン(>)を解凍し、[Q] UAD(64ビット整数)
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.