我想找出特定文件的创建日期,而不是修改日期或访问日期。

我尝试使用ls -ltrhstat filename

评论

Linux不跟踪创建时间,因为POSIX不需要。但是,Mac OS X使用HFS文件系统-在stat(1)中的“出生时间”下查找。

Fedora 19 ext4文件系统确实设置了文件创建时间。我敢肯定还有更多的例子。请参阅下面的答案,该步骤使用stap来检索创建时间。

参见unix.stackexchange.com/questions/7562/…

#1 楼

关于存储创建时间的文件系统的信息。

请注意,在Linux上,这需要stat -c '%w' file 8.31,coreutils 2.28和内核版本4.11或更高版本。

POSIX标准仅为每个文件定义了三个不同的时间戳:最后一次数据访问的时间,最后一次数据修改的时间以及文件状态的最后更改时间。

现代Linux文件系统(例如ext4,Btrfs和JFS)确实存储了文件创建时间(又名出生时间),但对相关字段使用不同的名称(ext4中的glibc,Btrfs和JFS中的crtime)。 Linux提供了statx(2)系统调用接口,用于检索自内核版本4.11起支持该文件系统的文件系统的文件出生时间。

正如Craig Sanders和Mohsen Pahlevanzadeh所指出的那样,otime确实支持stat%w格式说明符,用于显示文件%W版本8.31之前的出生时间(分别以人类可读的格式和以秒为单位)。但是,coreutils coreutils使用stat系统调用,仅在版本8.31以后才可以使用它来检索出生时间。
statx()版本8.31之前,coreutils通过gnulib(在stat中)提供的get_stat_birthtime()访问了出生时间。 lib/stat-time.h系统调用返回的st_birthtime结构的st_birthtimensecstat字段中的时间。例如,尽管BSD系统(以及扩展OS X)通过stat()提供st_birthtime,但是Linux却没有。这就是为什么statstat -c '%w' file 8.31之前的Linux上输出-(表示未知的创建时间)的原因,即使对于确实在内部存储创建时间的文件系统也是如此。

正如Stephane Chazelas指出的那样,某些文件系统(例如ntfs-3g)通过扩展的文件属性来公开文件创建时间。

评论


您可以使用stap创建自己的内核API。在这里查看答案示例。

–rickhg12hs
13-10-15在13:12

POSIX实际上是错误的。 mtime曾经是mtime和ctime,而ctime是原始unix中的创建时间。参见blog.plover.com/Unix/ctime.html

–Dani_l
20年7月31日在14:14

#2 楼

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分区上的inode具有创建时间。这是一个Shell脚本,该脚本确定与文件名关联的inode,然后使用stat(“ systemtap”)使用创建时间扩展stap的输出。

NB:这只是一个演示,效率很低,因为每次执行都会创建,加载和卸载内核模块。由于未执行错误检查,因此这也可能非常脆弱。适当的内核API是更可取的,但是此脚本可以提高效率,并读取多个文件/节点的创建时间。

[stap_stat.sh的内容]

#/bin/sh

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

stap - << end_of_stap_script
global my_offsetof
probe begin {
  system("stat ");
  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
$ 


评论


好的,那很酷。 +1使用stap,猴子修补Linux内核,真棒。

–克里斯·马格努森(Chris Magnuson)
15年6月24日在1:20

@ChrisMagnuson:debugfs + stat允许获取crtime,而无需猴子修补内核。

– jfs
16年7月26日在13:41

#3 楼

从理论上讲,使用GNU stat,您可以使用stat -c '%w'%W来获取文件的创建日期(也称为出生时间)。

实际上,大多数文件系统都不记录该信息,并且linux内核不提供任何方式

获得的最接近的是文件的ctime,它不是创建时间,而是文件元数据最后一次更改的时间。

Linux几年前,《每周新闻》刊登了一篇有趣的文章-文件创建时间。

#4 楼

ext4中可以;因为ext4文件系统存储了文件创建时间。但是,您仍然会发现stat命令无法显示日期,因为我认为内核对此没有任何API。

无论如何,文件出生时间存储在ext4中,您可以找到它,虽然不是直接方法,但可以使用debugfs


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


评论


作为bash函数:xstat文件名

– jfs
16年7月26日在13:39

如果将/ dev / sdxX挂载在/ some / path中并且文件是/ some / path / some / file,则要指定的路径仅是some / file:其路径必须不指向文件系统根目录,而必须指向挂载点。否则,将找不到该文件。

– BowPark
18年6月27日在13:33

#5 楼

在OS X中,您可以使用ls -lUstat -f%BGetFileInfo -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


评论


非常有用,谢谢!显然,有多种方法可以做到这一点。

– GDP2
20-2-17在17:52

#6 楼

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

stat --printf='%W' yourfile   #seconds from Epoch , 0 if unknown
FreeBSD上的GNU\Linuxstat command之间的区别:

如果在stat中调用GNU\Linux命令,它将调用-x选项,但是在FreeBSD中,您应该自己调用-x选项。

另请参阅Linux上的哪些文件系统会存储创建时间?

注意:--printfscripting中非常有用....!

评论


//,在CEntOS 6机器上进行了尝试,得到的只是问号:$ stat --printf ='%w'〜/ dump.rdb?也许我的文件系统不支持%w的统计信息。

– Nathan Basanese
15年8月21日在19:23

不幸的是,HFS不支持ctime。

–波斯湾
15年8月22日在9:33

#7 楼

检查一下:

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


BTW,这仅适用于ext4。我还没有找到BtrFS的解决方案...;)

评论


那几乎就是初学者的回答……不是吗?

–don_crissti
2015年12月28日23:49



哎呀,你说得对@don_crissti

–雷尼奇
2015年12月30日0:49在