จะตรวจสอบการประทับเวลาทั้งหมดของไฟล์ได้อย่างไร


52

มีคำสั่งใน Linux เพื่อตรวจสอบการประทับเวลาทั้งหมดของไฟล์หรือไม่?

ฉันกำลังพยายามดูวันที่แก้ไขสร้างและแตะวันที่ล่าสุดบนไฟล์


4
เพียงแค่ชี้ให้เห็นไฟล์ Linux ไม่มีวันเกิด ดังนั้นจึงเป็นไปไม่ได้ที่จะกำหนดวันที่ที่ไฟล์ถูกสร้างขึ้น
FatalError

สังเกตว่า = (. ขอบคุณสำหรับการชี้ให้ฉัน.
Mechaflash

4
@FatalError: ระบบไฟล์ต่างๆรองรับการบันทึกเวลาเกิด / สร้าง ปัญหาที่แท้จริงคือการเข้าถึงข้อมูลพิเศษดังกล่าว (อย่างใดอย่างหนึ่งไม่สามารถขยายได้struct statโดยไม่ทำลายสิ่งโชคไม่ดี ... ) คุณสามารถลองdebugfs -R "stat <1234>" /dev/sdXYext4 แทนที่1234ด้วย ino
grawity

@grawity: เรียบร้อย! ฉันสงสัยอยู่เสมอว่าทำไมไม่มี FS มาก่อน แต่ฉันคิดว่าพวกเขาทำ แต่อย่างที่คุณพูดไม่สามารถทำลาย ABI สำหรับไบนารีที่มีอยู่ได้ ขอบคุณสำหรับทิป :).
FatalError

1
@FatalError เวลาเกิดสามารถแสดงได้ด้วยstatคำสั่งLinux ดูที่วิธีสร้างวันที่สร้างไฟล์ และระบบไฟล์ใดบน Linux ที่จัดเก็บเวลาสร้าง? .
Franklin Piat

คำตอบ:


72

statคำสั่งที่เรียกว่า

$ stat test
234881026 41570368 -rw-r--r-- 1 werner staff 0 0 "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" "Feb  7 16:03:06 2012" 4096 0 0 test

หากคุณต้องการปรับรูปแบบให้อ้างถึงหน้าคนเนื่องจากผลลัพธ์เป็นเฉพาะระบบปฏิบัติการและแตกต่างกันภายใต้ Linux / Unix

โดยทั่วไปคุณสามารถรับเวลาผ่านรายการไดเรกทอรีปกติเช่นกัน:

  • ls -l เอาต์พุตครั้งล่าสุดที่เนื้อหาไฟล์ถูกแก้ไข mtime
  • ls -lcเอาต์พุตครั้งสุดท้ายของการแก้ไขสถานะไฟล์, ctime( ความแตกต่างคืออะไร )
  • ls -luเอาท์พุทเวลาเข้าถึงล่าสุด, atime(แม้ว่าประโยชน์ของแนวคิดนี้อาจมีการอภิปราย )

และแน่นอนctimeไม่บันทึกเมื่อไฟล์ถูก "สร้าง" ข้อมูลจำเพาะ POSIX กำหนดเวลาประทับเพียงสามครั้ง แต่ระบบไฟล์ Linux บางระบบเก็บเวลาเกิด / เวลาสร้าง จะหาวันที่สร้างไฟล์ได้อย่างไร? ในการกำหนดค่าที่รองรับเช่นนี้สามารถใช้ได้

stat --printf '%n\nmtime: %y\nctime: %z\natime: %x\ncrtime:%w\n'

statมีรายละเอียดจริงๆ แต่lsต้องการเพียงหนึ่งบรรทัด มันจะดีถ้ามันสามารถแสดงวินาที อย่างไรก็ตามเมื่อสร้างรายการไฟล์ไฟล์เก่าจะเหมาะสมที่สุด
neverMind9

ls -l เป็นวิธีแก้ปัญหาอย่างรวดเร็วสำหรับฉัน
Andrew

ฉันสังเกตเห็นว่าผลลัพธ์ของls -lสามารถแสดงรูปแบบวันที่ที่แตกต่างกันเมื่อมีการติดตั้ง BusyBox (บน Android) ฉันคิดว่าถ้าไม่มีมันก็เหมือนกับ "2019-07-26 14:41" และด้วยมันก็เหมือนกับ "6 พฤษภาคม 21:27" ปีที่หายไปทำไม มีวิธีบังคับให้ใช้รูปแบบที่ไม่มีหรือไม่
นักพัฒนา android

@androiddeveloper เหมือนที่ฉันพูดคำตอบขึ้นอยู่กับระบบปฏิบัติการ ฉันคิดว่าคุณควรเปิดคำถามใหม่ หากคุณกำลังพูดถึง Android โดยเฉพาะบางทีผู้ที่ชื่นชอบStack OverflowหรือAndroidอาจเหมาะสมกว่า
slhck

@slhck เป็นระบบปฏิบัติการเดียวกับที่ติดตั้ง BusyBox ฉันถามว่าเป็นไปได้ (ความหมาย: มีคำสั่งให้ใช้) เพื่อรับรูปแบบที่จะแสดง
นักพัฒนา android

21

มีสามค่าเวลาที่แตกต่างกันเท่านั้นที่เก็บไว้สำหรับแต่ละไฟล์ของคุณตามที่กำหนดโดยมาตรฐาน POSIX : http://pubs.opengroup.org/onlinepubs/9699919799/ (ดูที่ส่วนคำจำกัดความฐาน -> 4. แนวคิดทั่วไป -> 4.8 ไฟล์ ปรับปรุงครั้ง)

แต่ละไฟล์มีสามประทับเวลาที่แตกต่างกันที่เกี่ยวข้อง: เวลาที่ผ่านมาของการเข้าถึงข้อมูลเวลาที่ผ่านมาการแก้ไขข้อมูลและเวลาที่สถานะไฟล์การเปลี่ยนแปลงที่ผ่านมา ค่าเหล่านี้จะถูกส่งกลับในโครงสร้างลักษณะไฟล์ struct สถิติที่อธิบายไว้ใน<SYS / stat.h>

และจาก<sys / stat.h> :

atime is for Last data access timestamp.
mtime is for Last data modification timestamp.
ctime is for Last file status change timestamp.

ตัวอย่างต่อไปนี้แสดงความแตกต่างระหว่างatime , mtimeและctimeตัวอย่างเหล่านี้อยู่ใน GNU / Linux BASH คุณสามารถใช้stat -xใน Mac OS X หรือ BSD Dist อื่น ๆ เพื่อดูรูปแบบผลลัพธ์ที่คล้ายกัน

$ stat --version
stat (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ touch test
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:58:28.609223953 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

เมื่อไฟล์เพิ่งสร้างขึ้นการประทับเวลาสามครั้งจะเหมือนกัน


1. เวลา

ขั้นแรกให้เข้าถึงข้อมูลของไฟล์โดยอ่าน ( lessหรือvim) พิมพ์ออก ( cat) หรือคัดลอกไปยังไฟล์อื่น ( cp)

$ cat test #Nothing will be printed out, since the file is empty
$ stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800  <-- atime Changed!
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 10:58:28.609223953 +0800

2. เวลา

ตอนนี้ขอเปลี่ยนสถานะไฟล์โดยเปลี่ยนการอนุญาต ( chmod) หรือเปลี่ยนชื่อมัน ( mv)

$ chmod u+x test
$ stat stet
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:04:10.178285430 +0800  <-- ctime Changed!
$    
$ mv test testing
$ stat testing
  File: `testing'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 10:58:28.609223953 +0800
Change: 2014-03-16 11:06:33.342207679 +0800  <-- ctime Changed again!

โปรดทราบว่าจนถึงตอนนี้เนื้อหา ( ข้อมูล ) ของไฟล์ยังคงเหมือนเดิมเมื่อสร้าง


3. mtime

สุดท้ายเรามาแก้ไขเนื้อหาของไฟล์โดยแก้ไขไฟล์

$ echo 'Modify the DATA of the file' > testing
$ echo 'Modify the DATA of the file also change the file status' > testing
$ stat testing
  File: `testing'
  Size: 56          Blocks: 8          IO Block: 4096   regular file
Device: 811h/2065d  Inode: 98828525    Links: 1
Access: (0764/-rwxrw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-16 10:59:13.182301069 +0800
Modify: 2014-03-16 11:09:48.247345148 +0800  <-- mtime Changed!
Change: 2014-03-16 11:09:48.247345148 +0800  <-- ctime also Changed!

4. เวลาเกิด

โปรดทราบว่าเวอร์ชันใหม่กว่าของstat(เช่นstat --version 8.13ใน Ubuntu 12.04) มีข้อมูลเวลาประทับครั้งที่ 4 - เวลาเกิด ( เวลาสร้างไฟล์) แม้ว่ามันอาจจะไม่แสดงเวลาที่ถูกต้องในตอนนี้:

$ stat --version
stat (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
$
$ stat birth_time
  File: `birth_time'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d  Inode: 4073946     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ bingyao)   Gid: ( 1000/ bingyao)
Access: 2014-03-16 10:46:48.838718970 +0800
Modify: 2014-03-16 10:46:48.838718970 +0800
Change: 2014-03-16 10:46:48.838718970 +0800
 Birth: -

ความหมายของ 10: 46: 48.838718970 คืออะไร? HH: MM: SS นาโนวินาที?
Dzung Nguyen

2
ใช่แล้ว "ตั้งแต่เคอร์เนล 2.5.48 โครงสร้างสถิติรองรับความละเอียดระดับนาโนวินาทีสำหรับฟิลด์บันทึกเวลาสามไฟล์ .... "
Tom Lord

เวลาในการสร้างสามารถคำนวณได้ด้วยการเข้าถึงรูทและดีบั๊ก
Mikko Rantalainen

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