web-dev-qa-db-ja.com

ファイルのタイムスタンプ、変更時刻、作成時刻

私はそれを知っていますls -tおよびls -fディレクトリの下のファイルとサブディレクトリの異なる並べ替えを提供します。

  • ファイルのタイムスタンプ、変更時刻、作成時刻の違いは何ですか?
  • これらの種類の情報をコマンドで取得して変更するにはどうすればよいですか?
  • どのような情報に関して、ファイルは他のファイルより「新しい」と言われますか?
  • どのような種類の情報を変更しても、ファイルは変わりませんか?

たとえば、誰かが書いたのを見ました:

デフォルトでは、rsyncプログラムはファイルのサイズとタイムスタンプが異なるかどうかのみを調べます。どのファイルが新しいかは関係ありません。異なる場合、上書きされます。 '--update'フラグをrsyncに渡すと、ソース上のファイルよりも新しいファイルが同じタイプのファイルである場合に限り、宛先上のファイルがスキップされます。これは、たとえば、ソースファイルが通常のファイルで、宛先がシンボリックリンクの場合、タイムスタンプに関係なく宛先ファイルが上書きされることを意味します。

余談ですが、ここでのファイルタイプは通常のファイルとsimlinkのみを意味し、pdf、jpg、htm、txtなどのタイプを意味しませんか?

108
Tim

「タイムスタンプ」には3種類あります。

  • アクセス-ファイルが最後に読み取られた時間
  • 変更-ファイルが最後に変更された時刻(内容が変更されています)
  • 変更-ファイルのメタデータが最後に変更された時間(例:権限)

この情報を表示するには、coreutilsの一部である stat を使用できます。

statには、デバイス、iノード、リンクなどの詳細情報も表示されます。

この種の情報は、ファイルシステムとマウントオプションに大きく依存することに注意してください。たとえば、noatimeオプションを使用してパーティションをマウントした場合、アクセス情報は書き込まれません。

タイムスタンプを変更するユーティリティはtouchです。どのタイムスタンプを変更するかを決定するためのいくつかの引数があります(たとえば、-aはアクセス時間、-mは変更時間)、指定された新しいタイムスタンプの解析に影響を与えます。詳細は man touch を参照してください。

touchは、cp -u)と組み合わせて使用​​すると便利です。「コピー元のファイルがコピー先のファイルよりも新しい場合、またはコピー先のファイルが見つからない場合のみ」)または空のマーカーファイルの作成用。

146
echox

Echoxの答えは有効ですが、ファイル作成時間に関する情報を追加したいと思います。

ファイルシステムのサポート

一部のファイルシステムは、作成時刻(または生成時刻)に関するiノードの追加エントリをサポートしています。 ext4がこの機能 をサポートし、 JFSおよびBTRFS もサポートすることを知っています。

ただし、ほとんどのツールとAPIは、この追加情報を読むためにまだ更新されていません。したがって、たとえ存在する可能性があっても、アクセスできません。

たとえば、Ubuntu 12.04 LTSで、私が今日作成したファイルについて次の情報を取得します。

$ echo Just another test > /tmp/mytest
$ sleep 3
$ touch /tmp/mytest
$ sleep 2
$ cat /tmp/mytest > /dev/null
$ stat /tmp/mytest 
[...]
Access: 2012-06-05 13:33:44.279774711 +0200
Modify: 2012-06-05 13:33:34.611893317 +0200
Change: 2012-06-05 13:33:34.611893317 +0200
 Birth: -
$ Sudo debugfs -R 'stat /tmp/mytest' /dev/sda1
[...]
 ctime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
 atime: 0x4fcdee98:42b417dc -- Tue Jun  5 13:33:44 2012
 mtime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
crtime: 0x4fcdee46:01258f1c -- Tue Jun  5 13:32:22 2012
[...]

新しいstat関数にはbirthフィールドがあることがわかりますが、出力は正しくないようです。そして、debugfsを介して情報を取得できます(ext4ファイルシステムを使用しているため、crtime)。

statxサポート

カーネル4.11から、新しいstatxシステムコール が登場しました。Y2038またはネットワークファイルシステムのサポートの向上に加えて、btimeや誕生時間(作成)などの機能が追加されています。時間)アクセス。 ext4のサポートは、同じカーネルリリース4.11で行う必要があります。

以降のカーネルリリースでは、この新しいsyscallにサポートを追加するパッチがあります。カーネル4.13のBTRFSおよびF2FS、4.14のSMB3、4.15のGFS2、4.16のNFSなど.

今後のglibcは、このインターフェイスを照会する関数呼び出しを提供します( glibc statxサポートに関するPhoronixニュース を参照)。したがって、この機能のユーザースペースでのサポートはまもなく開始される予定です。

38
Huygens