เปิดไฟล์ครั้งสุดท้าย


94

เป็นไปได้ไหมที่จะมีเวลาเมื่อเปิดไฟล์ครั้งล่าสุดและเรียงลำดับไฟล์ทั้งหมดในไดเรกทอรีตามเวลาเหล่านั้น?

คำตอบ:


172

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "เปิด" แต่โดยทั่วไปใช่ โดยปกติจะมีการบันทึกเวลาสามรายการ:

  • mtime- อัปเดตเมื่อเนื้อหาไฟล์เปลี่ยนแปลง นี่เป็นเวลาไฟล์ "เริ่มต้น" ในกรณีส่วนใหญ่
  • ctime- อัปเดตเมื่อไฟล์หรือข้อมูลเมตา (เจ้าของสิทธิ์) เปลี่ยนแปลง
  • atime - อัปเดตเมื่ออ่านไฟล์

ดังนั้นโดยทั่วไปสิ่งที่คุณต้องการดูคือatimeไฟล์ คุณจะได้รับด้วยหรือstat lsคุณสามารถใช้ls -luในการทำเช่นนี้แม้ว่าฉันจะชอบที่จะใช้ls -l --time=atime(ซึ่งควรได้รับการสนับสนุนในการกระจาย Linux ที่ทันสมัยเกือบทั้งหมด) เพราะฉันไม่ได้ใช้บ่อยและเมื่อฉันจำได้ดีขึ้น และเมื่อต้องการเรียงลำดับตามเวลาให้เพิ่ม-tแฟล็กเป็น ls ดังนั้นคุณไป

มีข้อแม้ที่ใหญ่แม้ว่า การอัพเดต atime ทุกครั้งที่มีการอ่านไฟล์ทำให้เกิด IO ที่ไม่จำเป็นบ่อยครั้งมากทำให้ทุกอย่างช้าลง ดังนั้นการกระจายลีนุกซ์ส่วนใหญ่จะเริ่มต้นที่noatimeตัวเลือกเมานต์ระบบแฟ้มซึ่งโดยทั่วไปจะฆ่า atimes หรืออื่น ๆrelatimeซึ่งจะอัพเดตเฉพาะ atimes เมื่อผ่านขีด จำกัด (ปกติวันละครั้ง) หรือถ้าไฟล์นั้นถูกแก้ไขตั้งแต่การอ่านครั้งก่อน คุณสามารถค้นหาว่าตัวเลือกเหล่านี้ทำงานอยู่หรือไม่โดยการรันmountคำสั่ง

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

และระวังด้วยว่าcไม่ใช่ "การสร้าง" การสร้างไม่ได้ถูกติดตามโดยระบบไฟล์ Unix / Linux ซึ่งดูแปลก แต่จริง ๆ แล้วสมเหตุสมผลเพราะระบบไฟล์ไม่มีทางรู้ว่ามันเป็นของแท้หรือเปล่า - ไฟล์อาจถูกสร้างขึ้นเมื่อสี่สิบปีก่อนและคัดลอกมาที่นี่ และในความเป็นจริงผู้แก้ไขไฟล์หลายคนทำงานโดยการทำสำเนามากกว่าต้นฉบับ หากคุณต้องการข้อมูลนั้นควรใช้ระบบควบคุมเวอร์ชันเช่นที่gitดีที่สุด


9
ฉันจะให้มากกว่า +1 ถ้าทำได้เพราะไม่โทรเวลา "เวลาการสร้าง"
jsbillings

2
ตามภูเขา manpage, relatimeไม่มีอะไรเกี่ยวข้องกับขีด จำกัด รายวัน แต่ดูที่ atime เทียบกับ mtime และ ctime หาก atime นั้นเก่ากว่า mtime หรือ ctime จะมีการอัพเดต atime หาก atime ใหม่กว่าทั้งสองก็จะเหลือเพียงอย่างเดียว วัตถุประสงค์ของการทำเช่นนี้คือเพื่อรักษาความสัมพันธ์ระหว่าง atime และ mtime / ctime เนื่องจากบางแอปพลิเคชันใช้ข้อมูลดังกล่าวเช่น mutt เพื่อดูว่ามันได้อ่านกล่องจดหมายของคุณแล้วหรือยัง
jw013

1
@ jw013 เป็นกรณีนี้ตั้งแต่เคอร์เนล 2.6.30 เป็นความจริงที่การแจกแจงแบบเก่าบางอย่างอาจไม่มีลักษณะการทำงานนี้ (แต่สำหรับดิสทริบิวชันอย่าง Fedora มันเป็นความจริงแม้กระทั่งตอนที่ฉันเขียนคำตอบดั้งเดิมนี้เมื่อสามปีที่แล้ว) มองหาmountmanpage ที่อัปเดต
mattdm

1
lsลดเวลาโดยค่าเริ่มต้นเป็นความแม่นยำที่สมเหตุสมผล หากต้องการดูเวลาอย่างแม่นยำสามารถใช้งาน--full-timeได้
jlh

19

ls -ltu รายการไฟล์ทั้งหมดแสดงและจัดเรียงตามเวลาในการเข้าถึง

จากman ls:

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time

4

findคำสั่งที่ดีที่สุดสำหรับเรื่องนี้ ดู-ctime, -mtimeและ-atimeตัวเลือก


3

หากรายชื่อของคุณมีไว้สำหรับการบริโภคของมนุษย์ให้ใช้lsกับหนึ่งในธงเรียงลำดับวันที่ ( -tuสำหรับการเข้าถึง (อ่าน) เวลาเพียง-tเพื่อการแก้ไข (เขียน) หรือ-tcเวลาเปลี่ยน inode) ดูคำตอบของ mattdmสำหรับข้อมูลเพิ่มเติม (โดยเฉพาะอย่างยิ่งคำเตือนเกี่ยวกับ-aและคำจำกัดความของ-c)

ถ้านี่เป็นสำหรับการบริโภคของโปรแกรมแยกการส่งออกของlsเป็นปัญหา หากเชลล์ของคุณคือ zsh คุณไม่ต้องการอะไรlsเลย: zsh มีคุณสมบัติรอบตัวเพื่อเรียงลำดับการจับคู่โดยเพิ่มการเข้าถึง ( *(Oa)), การเปลี่ยนแปลง inode ( *(Oc)) หรือการปรับเปลี่ยน ( *(Om)) เวลา ตัวพิมพ์เล็กจัดoเรียงตามอายุที่เพิ่มขึ้น

act_on_files_by_date *(Om)

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

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

หากคุณต้องการเรียกใช้คำสั่งในหลาย ๆ ไฟล์พร้อมกันคุณต้องมีการตั้งค่าเพิ่มเติม โปรดทราบว่าact_on_files_by_date $(ls -t)ไม่สามารถใช้งานได้เช่นนี้เนื่องจากชื่อไฟล์ที่มีอักขระไวด์การ์ดหรือช่องว่างจะถูกขยายในผลลัพธ์ของการทดแทนคำสั่ง โค้ดต่อไปนี้ใช้ได้ตราบใดที่ไม่มีชื่อไฟล์มีบรรทัดใหม่หรืออักขระที่ไม่สามารถพิมพ์ได้:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

หากคุณต้องการจัดการกับชื่อไฟล์โดยพลการคุณจะมีเวลาที่ยากลำบากมากโดยไม่ต้องใช้เครื่องมือที่ทรงพลังมากกว่าเชลล์มาตรฐาน: zsh, perl, python ...

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