Làm thế nào để tìm ngày tạo của tập tin?


104

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 -ltrhstat filename.


5
Linux không theo dõi thời gian tạo vì POSIX không yêu cầu. Tuy nhiên, Mac OS X thực hiện với hệ thống tệp HFS - xem phần "thời gian sinh" trong stat(1).
200_success

2
Hệ thống tập tin Fedora 19 ext4 thiết lập thời gian tạo tập tin. Tôi chắc chắn có nhiều ví dụ nữa. Xem câu trả lời dưới đây sử dụng stapđể lấy thời gian tạo.
rickhg12hs

Câu trả lời:


88

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 ( crtimetrong ext4, otimetrong 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 SandersMohsen Pahlevanzadeh đã chỉ ra, statkhông hỗ trợ các bộ định dạng %w%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, statchí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_birthtimevà 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_birthtimensecstatstat()st_birthtimestatstat -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.


4
Trên Linux, nó hiện được lưu trữ trong nhiều hệ thống tập tin bao gồm ext4. Không có API kernel nào để có được nó mặc dù. Một số hệ thống tệp như ntfs-3g qua cầu chì làm cho nó có sẵn thông qua API thuộc tính mở rộng
Stéphane Chazelas

@StephaneChazelas Cảm ơn bạn đã bình luận. Cập nhật câu trả lời để cung cấp thêm chi tiết.
Thomas Nyman

Bạn có thể sử dụ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.
rickhg12hs

26

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
$ 

4
Ok, đó chỉ là mát mẻ. +1 để sử dụng ghim, khỉ vá nhân linux, tuyệt vời.
Chris Magnuson

@ChrisMagnuson: debugfs + statcho phép lấy crtimemà không cần khỉ vá nhân.
jfs

17

Trong ext4đó là có thể; bởi vì ext4hệ 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 statlệ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ữ ext4và 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


1
như một hàm bash:xstat filename
jfs

1
Nếu /dev/sdxXđược gắn vào /some/pathvà 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.
BowPark

15

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/


7
stat --printf='%w' yourfile   #human readable

stat --printf='%W' yourfile   #seconds from Epoch , 0 if unknown

Sự khác biệt giữa FreeBSDGNU\Linuxtrên stat command:

Nếu bạn gọi statlệnh trong GNU\Linuxnó sẽ gọi -x tùy chọn, nhưng trong FreeBSD, chính bạn nên gọi -xtù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....!


//, Đã thử điều này trên máy CEntOS 6 và tất cả những gì tôi nhận được là các dấu hỏi: $ stat --printf = '% w' ~ / dump.rdb? Có thể hệ thống tệp của tôi không hỗ trợ chỉ số với% w.
Nathan Basan

Thật không may, HFS không hỗ trợ ctime.
Tiếng Ba Tư

5

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

2

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;)


1
Đó là khá nhiều những gì beginer 's câu trả lời nói ... đúng không?
don_crissti

Rất tiếc, bạn @don_crissti đúng
Renich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.