ファイル作成日を取得するには?

ファイル作成日を取得するには?

Linuxシステムで特定のファイルの作成日を知りたいです。変更またはアクセスされた日付ではなく、生成された日付。

私は努力しましたが、ls -ltrhstat filenameに必要なものを提供できませんでした。この情報を入手するにはどうすればよいですか?

答え1

stat -c '%w' file作成時間が保存されるファイルシステムで。

Linuxでは、次のものが必要です。coreutils8.31、2.28 glibc、およびカーネルバージョン4.11以降

POSIX 標準は以下を定義します。3つの異なるタイムスタンプ各ファイルで保存:最後のデータアクセス時間、最後のデータ変更時間、最後のファイルステータス変更時間。

ext4、Btrfs、XFSなどの最新のLinuxファイルシステム(v5以上)とJFS、保存ファイルの作成時間(生年月日とも呼ばれます)関連フィールドには別の名前を使用します(crtimeext4 / XFS、otimeBtrfs、およびJFS)。 Linuxが提供する統計(2)カーネルバージョン4.11以降、それをサポートするファイルシステムのファイル生成時間を取得するためのシステムコールインタフェースです。 (したがって、ファイルシステムに作成時にサポートが追加されても、一部のデプロイされたカーネルは、そのファイルシステムバージョンの名目上のサポートが追加されても、デフォルトではサポートされません。たとえば、XFS v5.)

〜のようにクレイグ・サンダースそしてモーセンパルワンザデバージョン 8.31 以前は、ファイル作成時間 (それぞれが人間が読める形式とエポックの後の秒) を表示するために、および形式指定子がstat実際にサポートされていることを指摘していました。ただし、生年月日を照会できるシステムコールは8.31バージョンから可能である。バージョン8.31より前は、システムコールから返された構造体の合計フィールドから出生時刻を取得したgnulib(in)を介して出生時刻にアクセスしていました。たとえば、BSDシステム(および拡張OS X)はviaを提供しますが、Linuxではそうではありません。これが、Linux 8.31より前に生成時間を内部的に保存するファイルシステムの場合でも、出力(不明な生成時間を示す)がある理由です。%w%Wcoreutilscoreutils statstatx()coreutilsstatget_stat_birthtime()lib/stat-time.hst_birthtimest_birthtimensecstatstat()st_birthtimestatstat -c '%w' file-coreutils

〜のようにスティーブン・チャジェラスは次のように指摘しています。、一部のファイルシステム(ntfs-3gなど)は、拡張ファイル属性を介してファイル作成時間を公開します。

答え2

長すぎるstap「システムクリック」)独自のカーネルAPIを生成します。以下はext4生成時間抽出デモです。

Fedora 19システムからext4生成時間を抽出できます。これは私のものです:

$ uname -a
Linux steelers.net 3.11.1-200.fc19.i686.PAE #1 SMP Sat Sep 14 15:20:42 UTC 2013 i686 i686 i386 GNU/Linux

明らかに私のext4パーティションのinodeには作成時間があります。以下は、ファイル名に関連付けられているinodeを決定し、(「systemtap」)を使用してstat生成stap時間の出力を増やすシェルスクリプトです。

注:これは単なるデモです。非常に実行されるたびにカーネルモジュールが作成、ロード、アンロードされるため、非効率的です。エラーチェックは行われないため、これは非常に脆弱である可能性があります。適切なカーネルAPIがあれば良いですが、このスクリプトをより効率的に作成し、複数のファイル/inodeの作成時間を読むことができます。

[stap_stat.shの内容]

#/bin/sh

my_inode_str=$(stat --printf="%i" $1)

stap - << end_of_stap_script
global my_offsetof
probe begin {
  system("stat $1");
  my_offsetof = &@cast(0,"struct ext4_inode_info")->vfs_inode;
}
probe kernel.function("ext4_getattr@fs/ext4/inode.c") {
  probe_inode=\$dentry->d_inode;
  if (@cast(probe_inode, "struct inode")->i_ino == $my_inode_str) {
    my_i_crtime = &@cast(probe_inode - my_offsetof,"struct ext4_inode_info")->i_crtime;
    printf("CrTime: %s GMT\n", ctime(@cast(my_i_crtime, "timespec")->tv_sec));
    printf("CrTime (nsecs): %d\n", @cast(my_i_crtime, "timespec")->tv_nsec);
    exit();
  }
}
end_of_stap_script

以下はデモです:

$ ll testfile
ls: cannot access testfile: No such file or directory
$ touch testfile
$ ./stap_stat.sh testfile
  File: ‘testfile’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:17:04.221441084 -0400
Change: 2013-09-28 06:17:04.221441084 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ ll testfile
-rw-rw-r--. 1 Rick Rick 0 Sep 28 06:17 testfile
$ cat - >> testfile 
Now is the time ...
$ ll testfile 
-rw-rw-r--. 1 Rick Rick 20 Sep 28 06:18 testfile
$ ./stap_stat.sh testfile
  File: ‘testfile’
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:17:04.221441084 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ cat testfile 
Now is the time ...
$ ./stap_stat.sh testfile
  File: ‘testfile’
  Size: 20          Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:18:33.684374740 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ mv testfile testfile2
$ ./stap_stat.sh testfile2 
  File: ‘testfile2’
  Size: 20          Blocks: 8          IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 4850501     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/    Rick)   Gid: ( 1001/    Rick)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-09-28 06:19:12.199349463 -0400
Modify: 2013-09-28 06:18:33.684374740 -0400
Change: 2013-09-28 06:20:45.870295668 -0400
 Birth: -
CrTime: Sat Sep 28 10:17:04 2013 GMT
CrTime (nsecs): 220441085
$ 

答え3

理論的には、GNU統計を使用すると、ファイルの作成日(生年月日とも呼ばれる)を取得またはstat -c '%w'取得できます。%W

実際、ほとんどのファイルシステムはこの情報を記録せず、Linuxカーネルはそれにアクセスする方法を提供しません。

取得できる最も近いのはファイルのctimeです。いいえファイルメタデータが最後に変更された作成時間。

数年前、Linux Weekly Newsにこれに関する興味深い記事が掲載されました。ファイル作成時間

答え4

ls -lUOS Xでは、または以下をstat -f%B使用できます。GetFileInfo -dmdls -n kMDItemFSCreationDate

$ ls -lU
total 0
-rw-r--r--  1 lauri  staff  0 Apr 25 03:58 a
$ stat -f%B a
1398387538
$ stat -f%SB -t %Y%m%d%H%M a
201404250358
$ GetFileInfo -d a
04/25/2014 03:58:58
$ mdls -n kMDItemFSCreationDate a
kMDItemFSCreationDate = 2014-04-25 00:58:58 +0000

関連情報