web-dev-qa-db-ja.com

ファイルシステムのタイムスタンプの精度を決定する

ファイルのタイムスタンプの精度は、EXT3では1秒、UFSでは1マイクロ秒、EXT4では1ナノ秒に制限されています(少なくとも経験によると)。ファイルシステム情報のみに基づいてこれを判断する方法はありますか?

私が考えることができるハッキーな代替案は、すべての単体テストを秒に制限するか(現在行っています)、またはtouchファイルの束に制限してstat -c %xのゼロの桁を確認することです。

6
l0b0

私の知る限り、この情報が保存されている場所はありません。これはファイルシステムにコード化されています。ただし、ファイルシステムとそれに対応する精度のリストを手動で作成できます。 caseステートメントを使用して、ファイルシステムのリストに対してファイルシステムIDをテストします。精度が1秒未満の例はほとんどないため、デフォルトを1にすることができます。

古いバージョンのFATと現在のバージョンのZipは、オンラインで読んだものから2秒のタイムスタンプ精度を使用します。ただし、事実を確認することをお勧めします。

次のコマンドを使用して、ファイルのfilsystemのIDを取得できます。

stat -f --format="%t" $file
6
Stephen

通常は statvfs または pathconf を使用できますが、その情報を見つける方法をサポートしていないようです。

どうやらそのような機能は 議論されている 将来のPOSIX標準のために

また、パスごとにタイムスタンプの粒度を返すために、pathconfの機能強化のためにいくつかのツチブタを提出します。

残念ながら、OS固有の方法でさえも、今日それを行うためのクリーンな方法を見つけることができません。


ファイルシステムのリストを作成しようとするアプローチや、それが1秒未満の解決をサポートするかどうかは危険です。例えば、 ext4 iノードが256バイトの場合、ナノ秒の解像度をサポートしているようですが、128バイトの場合はサポートしていません。

包括的で正確なリストをコンパイルするのは難しく、rootアクセスが必要になる可能性があり、明日変更される可能性があります。 statを数回実行するよりも難しいように思えます。

3
Mikel

ファイルデータベースの検出を実装しました。最初にファイルのタイムスタンプを1234ミリに設定し、次にそれを再度読み取って、1234(少なくともミリ秒の精度)または1000(秒の精度)であるかどうかを確認します。私がこれまでに学んだことは次のとおりです。

  • XFSおよびEXT3:2番目の精度
  • EXT4:ミリ秒の精度
  • NTFS:100nsの精度(OK、これはドキュメントから入手しました...)
1
Daniel