เป็นไปได้ไหมที่จะมีเวลาเมื่อเปิดไฟล์ครั้งล่าสุดและเรียงลำดับไฟล์ทั้งหมดในไดเรกทอรีตามเวลาเหล่านั้น?
เป็นไปได้ไหมที่จะมีเวลาเมื่อเปิดไฟล์ครั้งล่าสุดและเรียงลำดับไฟล์ทั้งหมดในไดเรกทอรีตามเวลาเหล่านั้น?
คำตอบ:
ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "เปิด" แต่โดยทั่วไปใช่ โดยปกติจะมีการบันทึกเวลาสามรายการ:
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
ดีที่สุด
mount
manpage ที่อัปเดต
ls
ลดเวลาโดยค่าเริ่มต้นเป็นความแม่นยำที่สมเหตุสมผล หากต้องการดูเวลาอย่างแม่นยำสามารถใช้งาน--full-time
ได้
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
find
คำสั่งที่ดีที่สุดสำหรับเรื่องนี้ ดู-ctime
, -mtime
และ-atime
ตัวเลือก
หากรายชื่อของคุณมีไว้สำหรับการบริโภคของมนุษย์ให้ใช้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 ...