จะหาวันที่สร้างไฟล์ได้อย่างไร


104

ฉันต้องการทราบวันที่สร้างไฟล์โดยเฉพาะไม่ใช่วันที่แก้ไขหรือวันที่เข้าถึง

ฉันได้พยายามด้วยและls -ltrhstat filename


5
Linux ไม่ได้ติดตามเวลาการสร้างเนื่องจาก POSIX ไม่ต้องการ อย่างไรก็ตาม Mac OS X จะมีระบบแฟ้ม HFS - ดูใต้ "เวลาเกิด" stat(1)ใน
200_success

2
ระบบไฟล์ของ Fedora 19 ext4 ตั้งเวลาการสร้างไฟล์ ฉันแน่ใจว่ามีตัวอย่างอีกมากมาย ดูคำตอบด้านล่างที่ใช้stapในการดึงเวลาการสร้าง
rickhg12hs

คำตอบ:


88

มาตรฐาน POSIX จะกำหนดเวลาประทับที่แตกต่างกันสามครั้งเท่านั้นที่จะจัดเก็บสำหรับแต่ละไฟล์: เวลาของการเข้าถึงข้อมูลล่าสุดเวลาของการแก้ไขข้อมูลล่าสุดและเวลาที่สถานะไฟล์เปลี่ยนแปลงล่าสุด

ที่กล่าวว่าระบบไฟล์ Linux ที่ทันสมัยเช่น ext4, Btrfs และ JFS จะเก็บเวลาการสร้างไฟล์ (เวลาเกิดหรือที่รู้จัก) แต่ใช้ชื่ออื่นสำหรับฟิลด์ที่เป็นปัญหา ( crtimeใน ext4, otimeใน Btrfs และ JFS) อย่างไรก็ตามในปัจจุบัน Linux ไม่ได้จัดเตรียมเคอร์เนล API สำหรับการเข้าถึงเวลาการสร้างไฟล์แม้ในระบบไฟล์ที่สนับสนุนพวกเขา

ดังที่Craig SandersและMohsen Pahlevanzadehชี้ให้เห็นว่าstatสนับสนุน%wและตัว%Wระบุรูปแบบสำหรับการแสดงเวลาการเกิดไฟล์ (ในรูปแบบที่มนุษย์สามารถอ่านได้และในไม่กี่วินาทีนับตั้งแต่ยุคตามลำดับ) อย่างไรก็ตามstatตัวมันเองเข้าถึงเวลาเกิดget_stat_birthtime()โดย gnulib (ในlib/stat-time.h) ซึ่งได้รับเวลาเกิดจากst_birthtimeและst_birthtimensecฟิลด์ของstatโครงสร้างที่ส่งคืนโดยการstat()เรียกของระบบ ในขณะที่อินสแตนซ์ของระบบ BSD (และใน OS X ส่วนขยาย) มีให้st_birthtimeผ่านทางstatLinux ไม่ได้ นี่คือเหตุผลที่stat -c '%w' fileเอาต์พุต-(ระบุเวลาการสร้างที่ไม่รู้จัก) บน Linux แม้สำหรับระบบไฟล์ที่จัดเก็บเวลาการสร้างภายใน

เมื่อStephane Chazelas ชี้ให้เห็นระบบไฟล์บางระบบเช่น ntfs-3g จะเปิดเผยเวลาในการสร้างไฟล์ผ่านแอตทริบิวต์ไฟล์ที่ขยายเพิ่ม


4
บน Linux ตอนนี้มันถูกเก็บไว้ในระบบไฟล์มากมายรวมถึง ext4 เคอร์เนล API ยังไม่ได้รับมัน ระบบไฟล์บางระบบเช่น ntfs-3g over fuse ทำให้พร้อมใช้งานผ่านทางแอตทริบิวต์แบบขยาย API
Stéphane Chazelas

@StephaneChazelas ขอบคุณสำหรับความคิดเห็นของคุณ อัปเดตคำตอบเพื่อให้รายละเอียดเพิ่มเติม
Thomas Nyman

คุณสามารถใช้stapเพื่อสร้างเคอร์เนล API ของคุณเอง ดูตัวอย่างในคำตอบที่นี่
rickhg12hs

26

TLDR; ใช้stap( "SystemTap" ) เพื่อสร้างเคอร์เนล API ของคุณเอง สาธิตการแตกเวลาในการสร้าง ext4 ด้านล่าง

คุณสามารถแยกเวลาการสร้าง ext4 บนระบบ Fedora 19 ได้ นี่คือของฉัน:

$ 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

เป็นที่ชัดเจนว่า inodes บนพาร์ติชั่น ext4 ของฉันมีเวลาในการสร้าง นี่คือเชลล์สคริปต์ที่กำหนดไอโหนดที่เกี่ยวข้องกับชื่อไฟล์จากนั้นเพิ่มstatผลลัพธ์ด้วยเวลาการสร้างโดยใช้stap("systemtap")

หมายเหตุ: นี่เป็นเพียงการสาธิตและไม่มีประสิทธิภาพอย่างมหาศาลเนื่องจากมีการสร้างโมดูลเคอร์เนลโหลดและยกเลิกการโหลดสำหรับการดำเนินการทุกครั้ง สิ่งนี้อาจเปราะบางมากเนื่องจากไม่มีการตรวจสอบข้อผิดพลาด เคอร์เนล API ที่เหมาะสมน่าจะดีกว่า แต่สคริปต์นี้สามารถทำให้มีประสิทธิภาพมากขึ้นและอ่านเวลาในการสร้างไฟล์ / inodes จำนวนมาก

[เนื้อหาของ stap_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

นี่คือตัวอย่าง:

$ 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
ตกลงนั่นเจ๋งมาก +1 สำหรับการใช้งานหลักลิงกำลังปรับปรุงเคอร์เนลลินุกซ์
Chris Magnuson

@ChrisMagnuson: debugfs + statอนุญาตcrtimeโดยไม่ต้องลิง patching เคอร์เนล
jfs

17

ในext4มันเป็นไปได้; เนื่องจากext4ระบบไฟล์จัดเก็บเวลาการสร้างไฟล์ แต่ถึงกระนั้นคุณจะพบว่าstatคำสั่งไม่สามารถแสดงวันที่เพราะฉันคิดว่าเคอร์เนลไม่มี APIs สำหรับสิ่งนี้

อย่างไรก็ตามเวลาเกิดไฟล์จะถูกเก็บไว้ในext4และคุณสามารถค้นหาได้แม้จะไม่ใช่โดยวิธีการโดยตรง แต่โดยการใช้debugfs

sudo debugfs -R "stat / ABSOLUTE / PATH" / dev / sdxX | grep crtime


1
เป็นฟังก์ชั่นทุบตี:xstat filename
jfs

1
หาก/dev/sdxXถูกเมาท์/some/pathและไฟล์นั้นคือ/some/path/some/fileพา ธ ที่จะระบุเท่านั้นsome/file: พา ธ ของไฟล์นั้นจะต้องถูกเรียกไม่ใช่ไปที่รูทของระบบไฟล์ แต่ไปยังเมานต์ มิฉะนั้นจะไม่พบไฟล์
BowPark

15

ในทางทฤษฎีด้วย GNU stat คุณสามารถใช้stat -c '%w'หรือ%Wรับวันที่สร้างไฟล์

ในทางปฏิบัติระบบไฟล์ส่วนใหญ่จะไม่บันทึกข้อมูลและเคอร์เนล linux ไม่ได้ให้วิธีการเข้าถึงใด ๆ

สิ่งที่ใกล้เคียงที่สุดที่คุณจะได้รับคือเวลาของไฟล์ซึ่งไม่ใช่เวลาสร้างมันเป็นเวลาที่ข้อมูลเมตาของไฟล์ถูกเปลี่ยนครั้งล่าสุด

Linux Weekly News มีบทความที่น่าสนใจเกี่ยวกับเรื่องนี้เมื่อไม่กี่ปีก่อน - http://lwn.net/Articles/397442/


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

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

ความแตกต่างระหว่างFreeBSDและGNU\Linuxบนstat command:

หากคุณเรียกใช้statคำสั่งใน ตัวเลือกGNU\Linuxนี้จะเรียกใช้-xตัวเลือก แต่ใน FreeBSD ตัวคุณเองควรจะเรียกใช้-xตัวเลือก

ดูเพิ่มเติมระบบไฟล์ใดบน Linux ที่จัดเก็บเวลาสร้าง?

หมายเหตุ: --printfมีประโยชน์มากในscripting.... !


// ลองใช้เครื่อง CEntOS 6 และสิ่งที่ฉันได้รับคือเครื่องหมายคำถาม: $ stat --printf = '% w' ~ / dump.rdb? บางทีระบบไฟล์ของฉันไม่รองรับสถิติด้วย% w
Nathan Basanese

น่าเสียดายที่ HFS ไม่รองรับ ctime
PersianGulf

5

ใน OS X คุณสามารถใช้ls -lU, stat -f%B, GetFileInfo -dหรือ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

ลองดู:

# the last arg is the device to scan in.
debugfs -R 'stat /home/renich/somefile' /dev/sda1

BTW ใช้งานได้กับ ext4 เท่านั้น ฉันยังไม่พบวิธีแก้ปัญหาสำหรับ BtrFS ... ;)


1
ที่สวยมากสิ่งที่beginer 's คำตอบว่า ... ไม่ได้หรือไม่
don_crissti

อ๊ะคุณพูดถูกแล้ว @don_crissti
Renich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.