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


Answers:


85

不幸的是,您的搜寻通常无法进行,因为POSIX标准定义了每个文件仅存储3个不同的时间值(请参见基本定义部分4.8文件时间更新)。

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

编辑:如以下注释中所述,根据所使用的文件系统,元数据可能包含文件创建日期。但是请注意,此类信息的存储是非标准的。取决于它可能导致移植到另一个文件系统的可移植性问题,以防实际使用的文件以某种方式存储它。


7
真可悲。现在,轻松地确定文件是已删除还是重新创建还是一直存在非常有用。
froggythefrog

您知道在Mac上如何运作吗?Finder显示三个时间戳,分别为“创建”,“修改”,“最后开放时间” ...
johk95,2015年

强烈依赖于所使用的文件系统。但是无论如何都很好。:)尝试将缺少的信息添加到帖子中。
mikyra 2015年

41
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

3
ctime,atime和mtime分别是什么意思?
卡·达万佐

1
@Velthune创建时间,访问时间,修改时间。但是,取决于文件系统配置的方式,这些值可能正确也可能不准确。例如,许多人禁止将对文件的最后访问时间写入文件以保存在额外的磁盘写入中。
2014年

16
@indivisible:错!POSIX标准将ctime定义为更改时间。通常是在某些文件属性更改时。
ingyhere 2014年

我不知道标准,但是这里的ctime是不合时宜的。我认为创建时间应该是最古老的...
bartgol

更改时间和修改时间有什么区别?
罗恩·约翰(RonJohn)

24

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

如果要验证是否首先创建了该文件,则可以在创建一系列文件时通过附加系统日期来构造文件名。


8
当我统计myfile.txt时,我得到另一行:出生。不幸的是,它没有价值。为什么那排在那里?
allyourcode 2013年

它是另一个能够存储创建日期的文件系统的占位符。
MaXi32 '20

14

请注意,如果由于性能原因而用noatime挂载了文件系统,则atime可能会显示创建时间。鉴于noatime可以显着提高性能(通过在每次读取文件时删除磁盘写操作),这可能是一个明智的配置选项,它也可以为您提供所需的结果。


我不能保证性能会提高,但是我阅读了推荐noatime的SSD指南,因此这对我有用。
jake 2014年

6

创建日期/时间通常存储。所以不,你不能。


5

ls -i menus.xml

94490 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

18
ctime不是创建时间,它是“文件状态信息的最后修改时间”
mokalan

3
ctime =“更改时间”,其中更改表示所有者,组,特权或其他某些属性的修改。不一定是创建时间。
ingyhere 2014年

3

您可以使用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 -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手册页介绍了%w:

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

似乎ls -l显示的是修改时间,而不是创建时间或出生时间
truf

$ /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 '19

2

如@mikyra所述,创建日期时间未存储在任何地方。

上面的所有方法都很不错,但是如果您想快速获取上次修改日期,可以键入:

ls -lit /path

使用-t选项,您可以列出/ path到上次修改日期为止的所有文件。


1

如果您确实想实现这一目标,则可以使用诸如inotifywait之类的文件监视程序

您观察目录,并将有关文件创建的信息保存在该目录之外的单独文件中。

while true; do
  change=$(inotifywait -e close_write,moved_to,create .)
  change=${change#./ * }
  if [ "$change" = ".*" ]; then ./scriptToStoreInfoAboutFile; fi
done

由于没有存储创建时间,因此您可以基于inotify构建自己的系统。


0

/unix/50177/birth-is-empty-on-ext4/131347#131347引用,以下shellscript可以缩短创建时间:

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
}

0

更好的是:

lsct () 
{ 
    debugfs -R 'stat <'`ls -i "$1" | (read a b;echo -n $a)`'>' `df "$1" | (read a; read a b; echo "$a")` 2> /dev/null | grep --color=auto crtime | ( read a b c d;
    echo $d )
}

lsct / etc

2016年7月20日星期三19:25:48


0

添加到您的武器库的另一个技巧是:

$ grep -r "Copyright" /<path-to-source-files>/src

一般来说,如果更改文件,则应在“版权”中主张版权。检查结果中的日期,文件名,贡献者和联系电子邮件。

示例grep结果:

/<path>/src/someobject.h: * Copyright 2007-2012 <creator's name> <creator's email>(at)<some URL>>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.