我在Debian GNU / Linux 6.0上使用Bash。是否可以获取文件创建日期/时间?不是修改日期/时间。
ls -lh a.txt
和stat -c %y a.txt
都只提供修改时间。
答案 0 :(得分:73)
不幸的是,您的任务通常是不可能的,因为POSIX标准定义的每个文件只存储了3个不同的时间值(参见Base Definitions section 4.8 File Times Update)
每个文件都有三个不同的关联时间戳:最后一个时间 数据访问,上次数据修改的时间以及文件的时间 状态最后更改。这些值将在文件中返回 特征结构 struct stat ,如<sys/stat.h>中所述。
编辑:如下面的评论中所述,根据文件系统使用的元数据可能包含文件创建日期。但请注意,存储此类信息是非标准的。取决于它可能会导致移植到另一个文件系统的可移植性问题,以防实际使用它以某种方式存储它无论如何。
答案 1 :(得分:35)
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
答案 2 :(得分:15)
[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
如果要验证首先创建的文件,可以在创建一系列文件时通过附加系统日期来构建文件名。
答案 3 :(得分:13)
请注意,如果出于性能原因而使用noatime安装了文件系统,那么atime可能会显示创建时间。鉴于noatime会带来巨大的性能提升(通过每次读取文件时删除磁盘写入),它可能是一个合理的配置选项,也可以为您提供所需的结果。
答案 4 :(得分:5)
创建日期/时间通常不存储。所以不,你不能。
答案 5 :(得分:5)
94490 menus.xml 这里的数字94490代表inode
然后做一个:
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 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
答案 6 :(得分:2)
您可以使用 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 手册页解释了%w:
%w time of file birth, human-readable; - if unknown
答案 7 :(得分:1)
正如@mikyra所解释的那样,创建日期时间不存储在任何地方。
上述所有方法都很不错,但如果您想快速获取最后修改日期,可以输入:
ls -lit /path
使用 -t 选项列出上次修改日期的路径中的所有文件。
答案 8 :(得分:1)
如果你真的想要实现这一目标,你可以使用像inotifywait这样的文件观察器。
您可以观看目录,并将有关文件创建的信息保存在该目录之外的单独文件中。
while true; do
change=$(inotifywait -e close_write,moved_to,create .)
change=${change#./ * }
if [ "$change" = ".*" ]; then ./scriptToStoreInfoAboutFile; fi
done
由于没有存储创建时间,您可以基于inotify构建自己的系统。
答案 9 :(得分:0)
从https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/131347#131347引用,以下的shellcript将有助于创建时间:
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
}
答案 10 :(得分: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 )
}
2016年7月20日星期三19:25:48
答案 11 :(得分: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>>