web-dev-qa-db-ja.com

ファイルの作成日を知る方法は?

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

ls -ltrhおよびstat filename

112
Özzesh

作成時間を保存するファイルシステムのstat -c '%w' file

Linuxでは coreutils 8.31、glibc 2.28およびカーネルバージョン4.11以降 が必要であることに注意してください。

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

Ext4、Btrfs、JFSなどの最新のLinuxファイルシステム ファイルの作成時刻を保存します (別名:誕生時刻)が、問題のフィールドに異なる名前を使用します(ext4ではcrtimeotime in Btrfs and JFS)。 Linuxは、カーネルバージョン4.11以降、それをサポートするファイルシステムのファイルの誕生時間を取得するための statx(2) システムコールインターフェイスを提供します。

Craig Sanders および Mohsen Pahlevanzadeh が指摘したように、statは、ファイルの生年月日を表示するための%wおよび%W形式指定子を(人間が読める形式で、エポックからの秒数)coreutilsバージョン8.31より前。ただし、coreutilsstatは、バージョン8.31以降の場合に限り、statx()システムコールを使用して、出生時間を取得します。 coreutilsバージョン8.31より前のバージョンでは、statは、gnulib(lib/stat-time.h内)が提供するget_stat_birthtime()を介して出生時間にアクセスしました。これにより、st_birthtimeおよびst_birthtimensecstat構造体は、stat()システムコールによって返されます。たとえば、BSDシステム(および拡張OS X)はstatを介してst_birthtimeを提供しますが、Linuxは提供しません。 Linuxでcoreutils 8.31より前にstat -c '%w' file-(不明な作成時間を示す)を出力するのはこのためです。

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

97
Thomas Nyman

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ノードを決定し、stat( "systemtap")を使用してstap出力に作成時間を追加するシェルスクリプトを次に示します。

注:これは単なるデモであり、実行ごとにカーネルモジュールが作成、ロード、アンロードされるため、hugely非効率的です。エラーチェックが実行されないため、これもおそらく非常に壊れやすいものです。適切なカーネルAPIが望ましいですが、このスクリプトははるかに効率的になり、複数のファイル/ inodesの作成時間を読み取ることができます。

[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
$ 
26
rickhg12hs

理論的には、GNU statを使用すると、stat -c '%w'または%Wファイルの作成日(別名:誕生時刻)を取得します。

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

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

Linux Weekly Newsには、これに関する興味深い記事が数年前にありました- ファイル作成時間

18
cas

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

とにかく、ファイルの生年月日はext4に保存されており、直接的な方法ではなくdebugfsを使用して見つけることができます。

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

17
beginer
stat --printf='%w' yourfile   #human readable

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

GNU\LinuxFreeBSDstat commandの違い:

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

参照 Linuxのどのファイルシステムが作成時間を保存するか?

注:--printfscripting....で非常に便利です!

8
PersianGulf

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
8
Lri

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

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

ところで、これはext4でのみ機能します。 BtrFSの解決策はまだ見つかりません...;)

2
Renich