如何在Bash / Debian中获取文件创builddate/时间?

我在Debian GNU / Linux 6.0上使用Bash。 是否有可能获得文件创builddate/时间? 不是修改date/时间。 ls -lh a.txtstat -c %y a.txt都只给出修改时间。

不幸的是,你的任务一般是不可能的,因为POSIX标准定义的每个文件只有3个不同的时间值存储(参见基础定义部分4.8文件时间更新 )

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

编辑:正如在下面的评论中提到的,根据所使用的文件系统元数据可能包含文件创builddate。 但是请注意,这样的信息存储是非标准的。 根据它可能导致移植到另一个文件系统的可移植性的问题,如果实际上用某种方式存储它的话。

 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 

请注意,如果您出于性能方面的考虑使用noatime挂载了文件系统,则该时间可能会显示创build时间。 考虑到noatime会大大提高性能(通过每次读取文件时删除磁盘写入),它可能是一个明智的configuration选项,也可以给你想要的结果。

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 

如果您想validation最先创build的文件,则可以在创build一系列文件时通过追加系统date来构build文件名。

创builddate/时间通常存储。 所以不,你不能。

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 

要find根“/”文件系统的挂载点,因为文件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 

在哪里可以看到创build时间:

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

正如@mikyra所解释的,创builddate时间并不存储在任何地方。

以上所有的方法都很好,但是如果你想快速获取最后的修改date,你可以input:

 ls -lit /path 

使用-t选项,可以列出上次修改date的所有文件。

如果你真的想实现这个目标,你可以使用像inotifywait这样的文件监视器 。

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

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

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

你可以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查找在特定时间范围内创build的文件,如下所示。
显然,文件系统知道文件的出生时间:

 $ 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 

统计手册页解释%w:

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

https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347引用,下面的shellcript将获得创build时间:;

 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 } 

甚至更好:

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

lsct / etc

Wed Jul 20 19:25:48 2016