Tôi muốn tìm ra ngày tạo của tệp cụ thể, không phải ngày sửa đổi hoặc ngày truy cập.
Tôi đã thử với ls -ltrh
và stat filename
.
stap
để lấy thời gian tạo.
Tôi muốn tìm ra ngày tạo của tệp cụ thể, không phải ngày sửa đổi hoặc ngày truy cập.
Tôi đã thử với ls -ltrh
và stat filename
.
stap
để lấy thời gian tạo.
Câu trả lời:
Tiêu chuẩn POSIX chỉ xác định ba dấu thời gian riêng biệt được lưu trữ cho mỗi tệp: thời gian truy cập dữ liệu lần cuối, thời gian sửa đổi dữ liệu lần cuối và thời gian thay đổi trạng thái tệp lần cuối.
Điều đó nói rằng, các hệ thống tệp Linux hiện đại, chẳng hạn như ext4, Btrfs và JFS, lưu trữ thời gian tạo tệp (còn gọi là giờ sinh), nhưng sử dụng các tên khác nhau cho trường được đề cập ( crtime
trong ext4, otime
trong Btrfs và JFS). Tuy nhiên, hiện tại Linux không cung cấp API kernel để truy cập thời gian tạo tệp , ngay cả trên các hệ thống tệp hỗ trợ chúng.
Như Craig Sanders và Mohsen Pahlevanzadeh đã chỉ ra, stat
không hỗ trợ các bộ định dạng %w
và %W
định dạng để hiển thị thời gian sinh của tệp (ở định dạng có thể đọc được của con người và tính bằng giây kể từ Epoch). Tuy nhiên, stat
chính nó truy cập thời gian sinh thông qua get_stat_birthtime()
gnulib (in lib/stat-time.h
) được cung cấp , lấy thời gian sinh từ các trường st_birthtime
và cấu trúc được trả về bởi lệnh gọi hệ thống. Mặc dù các hệ thống BSD (và trong phần mở rộng OS X) cung cấp thông qua , Linux thì không. Đây là lý do tại sao các kết quả đầu ra (chỉ ra thời gian tạo không xác định) trên Linux ngay cả đối với các hệ thống tệp lưu trữ thời gian tạo bên trong.st_birthtimensec
stat
stat()
st_birthtime
stat
stat -c '%w' file
-
Như Stephane Chazelas chỉ ra , một số hệ thống tệp, chẳng hạn như ntfs-3g, hiển thị thời gian tạo tệp thông qua các thuộc tính tệp mở rộng.
stap
để tạo API hạt nhân của riêng bạn. Xem ví dụ trong câu trả lời ở đây.
TLDR; Sử dụng stap
( "SystemTap" ) để tạo API kernel của riêng bạn. Bản demo của trích xuất thời gian tạo ext4 dưới đây.
Bạn có thể trích xuất thời gian tạo ext4 trên các hệ thống Fedora 19. Đây là của tôi:
$ 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
Rõ ràng là các nút trên phân vùng ext4 của tôi có thời gian tạo. Đây là tập lệnh shell xác định inode được liên kết với tên tệp và sau đó tăng stat
đầu ra với thời gian tạo bằng cách sử dụng stap
("systemtap").
NB: Đây chỉ là một bản demo và cực kỳ kém hiệu quả vì một mô-đun hạt nhân được tạo, tải và không tải cho mỗi lần thực hiện. Điều này cũng có thể rất mong manh vì không có kiểm tra lỗi được thực hiện. API hạt nhân thích hợp sẽ thích hợp hơn, nhưng tập lệnh này có thể được thực hiện hiệu quả hơn nhiều và đọc thời gian tạo của nhiều tệp / nút.
[nội dung của chủ đề_stat.sh]
#/bin/sh
my_inode_str=$(stat --printf="%i" $1)
stap - << end_of_stap_script
global my_offsetof
probe begin {
system("stat $1");
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
Đây là bản demo:
$ 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
$
debugfs + stat
cho phép lấy crtime
mà không cần khỉ vá nhân.
Trong ext4
đó là có thể; bởi vì ext4
hệ thống tập tin lưu trữ thời gian tạo tập tin. Tuy nhiên, bạn sẽ thấy rằng stat
lệnh không thể hiển thị ngày, vì tôi nghĩ rằng kernel không có bất kỳ API nào cho việc này.
Dù sao, thời gian sinh của tệp được lưu trữ ext4
và bạn có thể tìm thấy nó, mặc dù không phải bằng phương pháp trực tiếp, nhưng bằng cách sử dụngdebugfs
gỡ lỗi sudo -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime
xstat filename
/dev/sdxX
được gắn vào /some/path
và tệp là /some/path/some/file
, đường dẫn được chỉ định chỉ là some/file
: đường dẫn của nó phải được gọi không phải là gốc hệ thống tệp, mà là đến điểm gắn kết. Nếu không, tập tin sẽ không được tìm thấy.
Về lý thuyết, với chỉ số GNU, bạn có thể sử dụng stat -c '%w'
hoặc %W
để lấy ngày tạo tệp (còn gọi là giờ sinh).
Trong thực tế, hầu hết các hệ thống tập tin không ghi lại thông tin đó và nhân linux không cung cấp bất kỳ cách truy cập nào.
Lần gần nhất bạn có thể nhận được là thời gian của tệp, không phải là thời gian tạo, đó là thời gian siêu dữ liệu của tệp được thay đổi lần cuối.
Linux Weekly News đã có một bài viết thú vị về điều này vài năm trước - http://lwn.net/Articles/397442/
stat --printf='%w' yourfile #human readable
stat --printf='%W' yourfile #seconds from Epoch , 0 if unknown
Sự khác biệt giữa FreeBSD
và GNU\Linux
trên stat command
:
Nếu bạn gọi stat
lệnh trong GNU\Linux
nó sẽ gọi -x
tùy chọn, nhưng trong FreeBSD, chính bạn nên gọi -x
tùy chọn đó.
Xem thêm Hệ thống tập tin nào trên Linux lưu trữ thời gian tạo?
Ghi chú: --printf
rất hữu ích trong scripting
....!
Trong OS X, bạn có thể sử dụng ls -lU
, stat -f%B
, GetFileInfo -d
, hoặc mdls -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
Kiểm tra này:
# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1
BTW, điều này chỉ hoạt động trên ext4. Tôi chưa tìm thấy giải pháp cho BtrFS ... nào;)
stat(1)
.