รับอายุของไฟล์ที่กำหนด


13

ฉันจะรับอายุของไฟล์ที่กำหนดอย่างน้อยวันได้อย่างไร

ฉันตระหนักดีls -lhและคำสั่งที่คล้ายกัน ฉันต้องการบางสิ่งที่จะทำงานเช่นนี้

getfage <FILE> # prints out '12d' (12 days)

นอกจากนี้สิ่งนี้จำเป็นต้องข้ามแพลตฟอร์มเนื่องจากฉันต้องการใช้ภายใต้ Mac OS X ด้วย แต่กรณีการใช้งานหลักอยู่ในกล่อง Linux ของฉัน

บันทึก

ตั้งแต่ Linux ไม่ได้ติดตามเวลาการสร้างฉันกำลังมองหาโซลูชันสองเท่า: หนึ่งสำหรับmtime (linux) - นั่นเป็นครั้งสุดท้ายที่กล่าวว่าไฟล์ถูกแก้ไข - และอีกหนึ่งสำหรับ Mac OS X ซึ่งสามารถจัดการกับmtimeหรือสร้างเวลา



@slm นั่นคือโดยเฉพาะเกี่ยวกับเวลาในการสร้างมันไม่ได้ไปคำนวณอายุบนบรรทัดคำสั่ง
Gilles 'หยุดความชั่วร้าย'


@terdon ไม่ได้จริงๆ ดูหมายเหตุของฉันด้านบน
Alexej Magura

@AlexejMagura และคำตอบในการล่อลวงไม่ได้ทำเพื่อคุณ? statให้ทุกสิ่งที่คุณต้องการใช่ไหม
terdon

คำตอบ:


17

Unix ไม่ได้ติดตามวันที่สร้าง ข้อมูลเท่านั้นที่มีอยู่โดยทั่วไปคือครั้งล่าสุดที่ไฟล์เป็น:

  1. เข้าถึงได้
  2. ดัดแปลง
  3. การเปลี่ยนแปลง
  • การเข้าถึง - ครั้งสุดท้ายที่อ่านไฟล์
  • แก้ไข - ครั้งล่าสุดที่ไฟล์ถูกแก้ไข (เนื้อหาได้รับการแก้ไข)
  • เปลี่ยน - ข้อมูลเมตาครั้งล่าสุดของไฟล์มีการเปลี่ยนแปลง (เช่นการอนุญาต)

( จากคำตอบนี้ )

คุณสามารถรับวันที่ที่เกี่ยวข้องกับไฟล์โดยใช้statคำสั่ง

ตัวอย่าง

$ stat ffmpeg 
  File: `ffmpeg'
  Size: 19579304    Blocks: 38248      IO Block: 4096   regular file
Device: fd02h/64770d    Inode: 10356770    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-11-26 10:49:09.908261694 -0500
Modify: 2013-11-02 17:05:13.357573854 -0400
Change: 2013-11-02 17:05:13.357573854 -0400

OSX และ HFS

หากคุณกำลังใช้ OSX ระบบไฟล์ที่ใช้ภายใต้ระบบปฏิบัติการยูนิกซ์เป็นHFS นี่เป็นหนึ่งในไม่กี่ (ที่ฉันรู้) ที่เก็บวันที่สร้างไว้ในระบบไฟล์พร้อมกับเวลาในการแก้ไข ฯลฯ คล้ายกับ Unixes อื่น ๆ

สิ่งที่สกัดมา

File Record เก็บข้อมูลเมตาดาต้าที่หลากหลายเกี่ยวกับไฟล์รวมถึง CNID ขนาดของไฟล์เวลาประทับสามครั้ง (เมื่อไฟล์ถูกสร้าง, แก้ไขล่าสุด, สำรองล่าสุด), ไฟล์แรกที่ขยายของข้อมูลและส้อมและพอยน์เตอร์ของทรัพยากร ไปยังระเบียนข้อมูลและทรัพยากรขอบเขตแรกของไฟล์ใน Extent Overflow File บันทึกไฟล์ยังเก็บฟิลด์ 16 ไบต์สองฟิลด์ที่ Finder ใช้เพื่อจัดเก็บแอตทริบิวต์เกี่ยวกับไฟล์รวมถึงสิ่งต่าง ๆ เช่นรหัสผู้สร้างรหัสประเภทหน้าต่างที่ไฟล์ควรปรากฏและตำแหน่งภายในหน้าต่าง

timestamps

การประทับเวลาจะถูกเก็บรักษาไว้เสมอในระบบไฟล์ดังนั้นคุณจึงถูก จำกัด ด้วยการติดตามเวลาที่มีให้ในการติดตามพวกเขา (EXT3, EXT4, XFS เป็นต้น)

ระบบแฟ้ม

หากคุณเคยอยากรู้อยากเห็นจะดูที่วิกิพีเดียหัวข้อนี้หัวข้อ: การเปรียบเทียบระบบไฟล์ มีรายการไฟล์ที่กว้างขวางที่สุดที่ฉันทราบพร้อมกับตารางที่ดีของคุณสมบัติต่างๆและสถานะของการสนับสนุนหรือไม่ภายในระบบไฟล์ที่กำหนด

อ้างอิง


ขอบคุณสำหรับการอัปเดตที่ช่วย ที่จริงแล้วฉันอ่านที่นี่ที่ ext4 สามารถเก็บวันที่สร้าง แต่สิ่งนี้ยังไม่ได้นำมาใช้ในเคอร์เนล
terdon

@terdon - ใช่มันทำให้รู้สึกว่าบางระบบไฟล์จะสนับสนุน ดูเหมือนว่านานเกินไปสำหรับฉันฉันเข้าใจในอดีตว่าทำไมมันถึงถูกทิ้ง แต่ทุกอย่างก้าวหน้าไปมากตั้งแต่เริ่มต้นซึ่งมันไม่สมเหตุสมผลที่จะไม่มีสิ่งนี้อย่างชัดเจน นอกจากนี้คุณสามารถปิดใช้งานการสนับสนุนสำหรับเวลาในการเข้าถึงเพื่อให้สามารถนำไปใช้ในทำนองเดียวกันและปิดใช้งานหากคุณไม่ต้องการ
slm

19

OSX ติดตามการสร้างไฟล์ แต่ Unices อื่น ๆ ส่วนใหญ่ไม่ทำดังนั้นจึงไม่มีทางรู้เวลาที่ผ่านไปนับตั้งแต่การสร้างไฟล์ คุณสามารถรับเวลาที่ผ่านไปนับตั้งแต่การปรับเปลี่ยนครั้งล่าสุดในระบบปฏิบัติการใด ๆ ก็ได้

ไม่มียูทิลิตี้เชลล์แบบพกพาที่จะเรียกคืนเวลาแก้ไขของไฟล์ยกเว้นlsว่ามีเอาต์พุตที่ไม่สามารถแยกวิเคราะห์ได้ ภายใต้ Linux คำสั่งต่อไปนี้จะพิมพ์อายุของไฟล์:

echo $(($(date +%s) - $(date +%s -r "$filename"))) seconds
echo $((($(date +%s) - $(date +%s -r "$filename")) / 86400)) days

ภายใต้ Linux คุณสามารถใช้stat -c %Y -- "$filename"เป็นคำเหมือนdate +%s -r "$filename"ได้

OSX dateและstatคำสั่งต่างกัน คุณสามารถใช้คำสั่งต่อไปนี้:

echo $(($(date +%s) - $(stat -t %s -f %m -- "$filename"))) seconds

ระบบ Linux ที่ไม่ได้ฝังตัวและ OSX จะติดตั้ง Perl โดยค่าเริ่มต้น

perl -l -e 'print -M $ARGV[0], " days"' "$filename"

สิ่งนี้ขึ้นอยู่กับระบบปฏิบัติการหรือระบบไฟล์หรือไม่? นี้ Q & A ดูเหมือนจะบ่งบอกว่าระบบแฟ้มช่วยให้พวกเขา แต่เคอร์เนลต้องการที่จะให้วิธีการในการเข้าถึงพวกเขา
terdon

@terdon - ดูอัปเดตของฉัน
slm

@terdon ทั้งสอง การถามและตอบที่คุณเชื่อมโยงนั้นถูกต้องระบบไฟล์ปัจจุบันได้ติดตามเวลาการสร้างมาระยะหนึ่งแล้ว ใน FreeBSD คุณสามารถรับสิ่งนี้ได้จากstatใน Linux syscall ยังไม่ได้ทำใหม่ดังนั้นคุณต้องหันไปแฮ็debugfs
wingedsubmariner

1
@wingedsubmariner ด้วยข้อแม้ที่เวลาการสร้างในระบบไฟล์มักจะไม่ใช่วันที่สร้างในแอปพลิเคชันเนื่องจากแอปพลิเคชันจำนวนมากใช้การสร้างใหม่แล้วย้ายเป็นวิธีการบันทึกเวอร์ชันใหม่แทนที่การเขียนทับในสถานที่
Gilles 'หยุดชั่วร้าย'

4

ตามคำตอบของ Gilles นี่คือฟังก์ชันทุบตีที่ส่งคืนอายุไฟล์เป็นวินาทีหรือมีข้อผิดพลาด

function fileAge
{
    local fileMod
    if fileMod=$(stat -c %Y -- "$1")
    then
        echo $(( $(date +%s) - $fileMod ))
    else
        return $?
    fi
}

1
ฟังก์ชั่นเรียบร้อยง่ายต่อการปรับเปลี่ยนโดยเพิ่มการแบ่งอย่างง่าย ๆ เพื่อดูอายุในชั่วโมง, วัน, สัปดาห์ ....
Emmanuel Devaux

0

คุณสามารถใช้stat -f%B, ls -lUหรือmdls -n kMDItemFSCreationDateที่จะเห็นเวลาที่สร้าง (เกิด) ใน OS X:

$ stat -f%B file
1402340803
$ ls -lU file
-rw-r--r--  1 admin  staff  108514 Jun  9 22:06 file
$ mdls -n kMDItemFSCreationDate file
kMDItemFSCreationDate = 2014-06-09 19:06:43 +0000
$ echo $((($(date +%s)-$(stat -f%B file))/86400))
10

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