如何在Bash/Debian中获取文件的创建日期/时间?

98

我正在使用Debian GNU/Linux 6.0上的Bash。是否可以获取文件的创建日期/时间?而不是修改日期/时间。 ls -lh a.txt stat -c%y a.txt 都只提供修改时间。


5
你是否使用记录创建时间的文件系统?大多数文件系统都不会记录。 - William Pursell
1
请参见http://askubuntu.com/questions/470134/how-to-find-the-creation-time-of-a-file。 - John Red
13个回答

95

很遗憾,通常情况下你的请求是不可能实现的。因为根据POSIX标准(请参见Base Definitions section 4.8 File Times Update),每个文件仅存储了三个不同的时间值。

每个文件都有三个不同的关联时间戳:最后一次数据访问的时间、最后一次数据修改的时间以及文件状态最后更改的时间。这些值在文件特性结构struct stat中返回,如<sys/stat.h>所述。

编辑:正如下面评论中提到的,根据使用的文件系统,元数据可能包含文件创建日期。但是需要注意的是,这种信息的存储不是标准化的。依赖于这种存储方式可能会导致在移动到另一个文件系统时出现可移植性问题,因为实际使用的文件系统可能以某种方式存储它。


9
这是个悲伤的消息。现在确定一个文件是被删除并重新创建过还是一直存在会非常有用。 - froggythefrog
你知道在Mac上如何运作吗?Finder显示三个时间戳,分别为“创建时间”、“修改时间”、“最后打开时间”... - johk95
1
@mikyra ext4 存储创建日期。 - Alex78191

46
ls -i file #output is for me 68551981
debugfs -R 'stat <68551981>' /dev/sda3 # /dev/sda3 is the disk on which the file exists

#results - crtime value
[root@loft9156 ~]# debugfs -R 'stat <68551981>' /dev/sda3
debugfs 1.41.12 (17-May-2010)
Inode: 68551981   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 769802755    Version: 0x00000000:00000001
User:     0   Group:     0   Size: 38973440
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 76128
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013
 atime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013
 mtime: 0x526931d7:1697cce0 -- Thu Oct 24 16:42:31 2013
**crtime: 0x52691f4d:7694eda4 -- Thu Oct 24 15:23:25 2013**
Size of extra inode fields: 28
EXTENTS:
(0-511): 352633728-352634239, (512-1023): 352634368-352634879, (1024-2047): 288392192-288393215, (2048-4095): 355803136-355805183, (4096-6143): 357941248-357943295, (6144
-9514): 357961728-357965098

5
ctime、atime 和 mtime 的意思分别是什么? - Luca Davanzo
1
@Velthune 创建时间,访问时间,修改时间。然而,根据文件系统的配置方式,这些值可能准确也可能不准确。例如,许多人禁用将最后访问时间写入文件以节省额外的磁盘写入。 - indivisible
19
错误!POSIX标准将ctime定义为更改时间,表示某个文件属性通常发生变化的时间。 - ingyhere
2
修改时间和变更时间有什么区别? - RonJohn
ctime 表示的是目录信息最后一次更新的时间;而mtime则表示的是文件本身最后一次被修改的时间。 - PJSCopeland
显示剩余3条评论

30

mikyra的回答很好,就像他所说的那样。

[jason@rh5 test]$ stat test.txt
  File: `test.txt'
  Size: 0               Blocks: 8          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 588720      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  500/   jason)   Gid: (  500/   jason)
Access: 2013-03-14 01:58:12.000000000 -0700
Modify: 2013-03-14 01:58:12.000000000 -0700
Change: 2013-03-14 01:58:12.000000000 -0700

如果你想要验证哪个文件是最先创建的,你可以在创建一系列文件时,在文件名后添加系统日期来构造你的文件名。


10
当我执行"stat myfile.txt"命令时,会得到另外一行信息:"Birth"。不幸的是,它没有任何值。为什么会出现这一行信息? - allyourcode
这是另一个文件系统的占位符,可以存储创建日期。 - MaXi32
我也得到了一个“Birth”行。这是在Windows 10上使用Git Bash,所以我认为文件系统应该是NTFS。 - AJM

17
请注意,如果您已将文件系统挂载为 noatime 以提高性能,则 atime 可能显示创建时间。鉴于 noatime 可以通过删除每次读取文件时的磁盘写入来显著提高性能,这可能是一个明智的配置选项,也可以给您想要的结果。

1
我不能保证性能提升,但我读过一篇SSD指南,建议使用noatime,所以这对我有用。 - jake

7

您可以使用stat查找创建时间,也可以使用find进行匹配。
这些文件显示上次修改时间:

$ ls -l --time-style=long-iso | sort -k6
total 692
-rwxrwx---+ 1 XXXX XXXX 249159 2013-05-31 14:47 Getting Started.pdf
-rwxrwx---+ 1 XXXX XXXX 275799 2013-12-30 21:12 TheScienceofGettingRich.pdf
-rwxrwx---+ 1 XXXX XXXX  25600 2015-05-07 18:52 Thumbs.db
-rwxrwx---+ 1 XXXX XXXX 148051 2015-05-07 18:55 AsAManThinketh.pdf

使用以下命令可以查找在特定时间范围内创建的文件: find。 很明显,文件系统知道文件的创建时间:
$ find -newerBt '2014-06-13' ! -newerBt '2014-06-13 12:16:10' -ls 
20547673299906851  148 -rwxrwx---   1 XXXX XXXX   148051 May  7 18:55 ./AsAManThinketh.pdf
1407374883582246  244 -rwxrwx---   1 XXXX XXXX   249159 May 31  2013 ./Getting\ Started.pdf

我们可以使用stat命令来确认这一点:
$ stat -c "%w %n" * | sort
2014-06-13 12:16:03.873778400 +0100 AsAManThinketh.pdf
2014-06-13 12:16:04.006872500 +0100 Getting Started.pdf
2014-06-13 12:16:29.607075500 +0100 TheScienceofGettingRich.pdf
2015-05-07 18:32:26.938446200 +0100 Thumbs.db


stat命令的man页面解释了%w:

%w     time of file birth, human-readable; - if unknown

似乎 ls -l 显示的是修改时间,而非创建或出生时间。 - truf
1
$ /usr/bin/find -newerBt '2014-06-13' /usr/bin/find: This system does not provide a way to find the birth time of a file. /usr/bin/find: invalid predicate -newerBt'` - user9074332

7
创建日期/时间通常不会被存储。所以,不行。

5

ls -i menus.xml

94490 是指 inode 编号。

然后执行:

df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg-root   4.0G  3.4G  408M  90% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/sda1             124M   27M   92M  23% /boot
/dev/mapper/vg-var    7.9G  1.1G  6.5G  15% /var

要找到根目录“/”文件系统的安装点,因为文件menus.xml在“/”上,即“/dev/mapper/vg-root”上。

使用命令debugfs -R 'stat <94490>' /dev/mapper/vg-root

输出可能像下面这样:

使用命令debugfs -R 'stat <94490>' /dev/mapper/vg-root

debugfs 1.41.12 (17-May-2010)
Inode: 94490   Type: regular    Mode:  0644   Flags: 0x0
Generation: 2826123170    Version: 0x00000000
User:     0   Group:     0   Size: 4441
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 16
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
atime: 0x5266e47b -- Wed Oct 23 09:47:55 2013
mtime: 0x5266e438 -- Wed Oct 23 09:46:48 2013
Size of extra inode fields: 4
Extended attributes stored in inode body: 
  selinux = "unconfined_u:object_r:usr_t:s0\000" (31)
BLOCKS:
(0-1):375818-375819
TOTAL: 2

您可以看到创建时间的位置:

ctime: 0x5266e438 -- Wed Oct 23 09:46:48 2013

20
ctime并不是文件的创建时间,而是“文件状态信息最后修改时间”。 - mokalan
5
ctime表示“更改时间”,其中的“更改”指的是修改所有者、组、权限或其他属性。它并不一定是创建时间。 - ingyhere

4
stat -c %w a.txt

%w 返回文件的创建(出生)日期,如果可以获取到的话,这种情况很少见。

这里是链接


对我来说可以运行。然而,新的文件系统(如ext4、zfs、btrfs、JFS和XFS)确实将创建时间戳存储在单独的字段中:https://www.baeldung.com/linux/get-file-creation-date - Estatistics

2

如@mikyra所解释的那样,创建日期时间并未存储在任何地方。

以上所有方法都很好,但如果您只想快速获取最后修改日期,可以输入:

ls -lit /path

使用 -t 选项可以列出 /path 目录下按最后修改日期排序的所有文件。


1
引用自https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347,以下 shell 脚本可以获取文件创建时间:
get_crtime() {
   for target in "${@}"; do
       inode=$(stat -c %i "${target}")
       fs=$(df "${target}"  | tail -1 | awk '{print $1}')
       crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | grep -oP 'crtime.*--\s*\K.*')
       printf "%s\t%s\n" "${target}" "${crtime}"
   done
}

大多数人不喜欢它,因为它需要使用 sudodebugfs - Jesse Chisholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接