ファイルの作成日を見つける方法は?


104

変更日やアクセス日ではなく、特定のファイルの作成日を知りたい。

私は試してみましたls -ltrhstat filename


5
LinuxはPOSIXに必要ではないため、作成時間を追跡しません。ただし、Mac OS XはHFSファイルシステムを使用します—の「birth time」をご覧くださいstat(1)
200_success

2
Fedora 19 ext4ファイルシステムはファイル作成時間を設定します。私はもっ​​と多くの例があると確信しています。stap作成時間を取得するために使用する以下の回答を参照してください。
rickhg12hs

回答:


88

POSIX標準では、各ファイルに保存される3つの異なるタイムスタンプ、つまり最後のデータアクセスの時刻、最後のデータ変更の時刻、およびファイルステータスが最後に変更された時刻のみを定義します。

つまり、ext4、Btrfs、JFSなどの最新のLinuxファイルシステムは、ファイル作成時間(別名誕生時間)を保存しますが、問題のフィールド(crtimeext4、otimeBtrfs、JFS)には異なる名前を使用します。ただし、現在Linuxは、ファイル作成時間をサポートするファイルシステム上であっても、ファイル作成時間にアクセスするためのカーネルAPIを提供していません

以下のようクレイグ・サンダースモフセンPahlevanzadehは指摘し、statサポートしていない%w%W(人間が読める形式でそれぞれエポックからの秒で)ファイル出生時間を表示するためのフォーマット指定子を。ただし、statそれ自体はget_stat_birthtime()gnulib(in lib/stat-time.h)によって提供された出生時間にアクセスします。これは、システムコールによって返された構造体のフィールドst_birthtimest_birthtimensecフィールドから出生時間を取得します。たとえば、BSDシステム(および拡張OS X)はviaを提供しますが、Linuxは提供しません。作成時間を内部に保存するファイルシステムであっても、Linuxで出力(不明な作成時間を示す)が出力されるのはこのためです。statstat()st_birthtimestatstat -c '%w' file-

以下のようステファンChazelasが指摘する、などntfs-3gをなどの一部のファイルシステムは、拡張ファイル属性を経由してファイルの作成時間を公開します。


4
Linuxでは、ext4を含む多くのファイルシステムに保存されるようになりました。ただし、カーネルAPIはまだありません。ヒューズオーバーntfs-3gをのようないくつかのファイルシステムは拡張属性APIを経由して、それを利用可能に
ステファンChazelas

@StephaneChazelasコメントありがとうございます。詳細を提供するために回答を更新しました。
トーマスナイマン

stap独自のカーネルAPIを作成するために使用できます。こちらの回答の例をご覧ください。
rickhg12hs

26

TLDR; 使用するstap「SystemTapのを」独自のカーネル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パーティションのiノードに作成時間が設定されていることは明らかです。これは、ファイル名に関連付けられたiノードを決定し、( "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
$ 

4
わかりました、それはクールです。+ 1、stapの使用、サルのLinuxカーネルへのパッチ適用、素晴らしい。
クリスマグナソン

@ChrisMagnuson:サルがカーネルにパッチを当てるdebugfs + statことcrtimeなく取得できるようにします。
JFS

17

ではext4、それが可能です。ext4ファイルシステムがファイル作成時間を保存するためです。それでも、statコマンドには日付を表示できないことがわかります。これは、カーネルにこのためのAPIがないためだと思います。

とにかく、ファイルの誕生時刻はに保存されてext4おり、直接的な方法ではなく、debugfs

sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime


1
bash関数として:xstat filename
jfs

1
場合/dev/sdxXに搭載され/some/path、ファイルがあり/some/path/some/file、指定されるパスが唯一であるsome/file:そのパスではなく、ファイルシステムのルートに、しかし、マウントポイントを参照する必要があります。そうしないと、ファイルが見つかりません。
ボウパーク

15

理論的には、GNU statを使用すると、ファイルの作成日(stat -c '%w'または%Wbirthtime)を使用したり、取得したりできます。

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

最も近いのはファイルのctimeです。これは作成時刻ではなく、ファイルのメタデータが最後に変更された時刻です。

Linux Weekly Newsには、これに関する数年前の興味深い記事がありました-http://lwn.net/Articles/397442/


7
stat --printf='%w' yourfile   #human readable

stat --printf='%W' yourfile   #seconds from Epoch , 0 if unknown

違いFreeBSDGNU\Linuxstat command

そのstatGNU\Linuxでコマンドを呼び出すと-x オプションが呼び出されますが、FreeBSDでは、自分で-xオプションを呼び出す必要があります。

Linuxのどのファイルシステムが作成時間を保存するかを参照してください

注: ....!で--printf非常に便利scriptingです。


// CEntOS 6マシンでこれを試してみましたが、疑問符だけが得られました:$ stat --printf = '%w'〜/ dump.rdb?多分私のファイルシステムは%wのstatをサポートしていません。
ネイサンバサネーゼ

残念ながら、HFSはctimeをサポートしていません。
ペルシャ湾

5

OS Xで使用することができls -lUstat -f%BGetFileInfo -d、またはmdls -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

2

これをチェックしてください:

# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1

ところで、これはext4でのみ動作します。私はBtrFSの解決策を見つけていません...まだ;)


1
それはほとんど初心者の答えが言うことです...そうではありませんか?
don_crissti

おっと、あなたは正しいです@don_crissti
Renich
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.