วิธีที่ดีที่สุดในการแสดงรายการ 100 ไฟล์แรกในไดเรกทอรีเรียงตามเวลา


12

สิ่งที่จะเป็นวิธีที่ดีที่สุดในการแสดงรายการ 100 ไฟล์แรกในไดเรกทอรีที่เรียงลำดับตามเวลาประทับที่สร้าง (เก่าที่สุดก่อน) ไดเรกทอรีมีขนาดค่อนข้างใหญ่ (ประมาณ 100,000 ไฟล์)

lsไปที่หัวใช้เวลานานมากในการทำให้เสร็จสมบูรณ์

แก้ไข:

  • ระบบไฟล์ ext3
  • การ จำกัด จำนวนไฟล์ในโฟลเดอร์นั้นไม่คุ้มค่ากับความพยายามเนื่องจากสิ่งนี้จะเป็นการดำเนินการ "ล้างข้อมูล" ที่หายากและไฟล์จะถูกสร้างขึ้นโดยซอฟต์แวร์บุคคลที่สาม
  • การใช้เวลาที่แก้ไขไฟล์แทนเวลาในการสร้างและวิธีแก้ไขที่ยอมรับได้


1
หากเป็นการดำเนินการล้างข้อมูลบางทีสิ่งที่คุณต้องการคือfind -mtime +<number of days> -deleteการล้างไฟล์ทั้งหมดที่เก่ากว่าอายุที่กำหนด นั่นหมายความว่าไม่จำเป็นต้องมีการจัดเรียง
Mikel

คำตอบ:


14

คุณบอกว่า " lsไปที่หัวใช้เวลานานมากในการทำให้เสร็จ"

สาเหตุของสิ่งนี้ไม่ใช่lsแต่จำนวนไฟล์ในไดเรกทอรีของคุณ หากคุณมี 100,000 ไฟล์ในไดเรกทอรีเดียววิธีใด ๆ ในการแก้ไขปัญหานี้จะต้องได้รับข้อมูลเกี่ยวกับ 100,000 ไฟล์ทั้งหมดก่อนที่จะนึกถึงการเรียงลำดับหรือพิมพ์ผลลัพธ์ใด ๆ

หากใช้เวลานานเกินไปทางออกที่แท้จริงคือการแบ่งไฟล์ไปยังหลายไดเรกทอรี

หากคุณไม่สามารถแพร่กระจายไฟล์ในช่วงหลายไดเรกทอรีจะมีวิธีใด ๆ ที่คุณสามารถแคบลงจำนวนไฟล์ที่จะต้องพิจารณา ? เช่นถ้าชื่อไฟล์มีวันที่บางทีคุณอาจรวมไวลด์การ์ดไว้เพื่อให้ระบบไม่ต้องเรียงลำดับ 100,000 ไฟล์ หรืออาจเป็นตัวเลขที่เรียงตามลำดับ (สิ่งนี้อาจช่วยได้หรืออาจจะไม่ช่วย แต่ก็คุ้มค่าที่จะลอง)

คุณพยายามทำเช่นนี้กี่ครั้ง อาจคุ้มค่าที่จะบันทึก / แคชเอาต์พุตเพื่อนำกลับมาใช้ใหม่


ตอนนี้คำถาม

คุณแน่ใจว่าคุณหมายถึง "เวลาที่สร้าง" และไม่ "เวลาเปลี่ยน" ? เครื่องมือส่วนใหญ่สามารถแสดง "เปลี่ยนเวลา" เท่านั้นไม่ใช่ "เวลาสร้าง"

การได้รับ "เวลาสร้าง" เป็นสิ่งใหม่มากซึ่งต้องใช้ระบบไฟล์ ext4 และเครื่องมือบางอย่างที่ไม่สามารถติดตั้งได้ง่าย


หากคุณต้องการเปลี่ยนเวลา

เปลี่ยนเวลา (ctime สำหรับระยะสั้น) หมายถึงเวลาที่แอตทริบิวต์ของไฟล์เปลี่ยนแปลงล่าสุด

ls -c เรียงตามเวลา

คุณต้องการผลลัพธ์ในลำดับมากไปน้อยไม่ใช่จากมากไปน้อยดังนั้นคุณต้องสลับเอาท์พุทด้วย-rตัวเลือกด้วย

ดังนั้นคุณสามารถทำเช่นนี้:

ls -cr | head -n 100

ทางออกที่ยาวกว่าสำหรับปัญหาเดียวกันโดยใช้stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

แต่มันจะช้ากว่าls -crระบบของฉัน


หากคุณต้องการปรับเปลี่ยนเวลา

เวลาแก้ไข (mtime สำหรับระยะสั้น) หมายถึงเวลาที่เนื้อหาของไฟล์เปลี่ยนแปลงล่าสุด

ls -t เรียงลำดับตาม mtime

เปลี่ยนls -crไปls -tr(ตัวเลือกที่ดีที่สุด) หรือการเปลี่ยนแปลงไปstat -c $'%Z\t%n'stat -c $'%Y\t%n'


หากคุณต้องการเวลาในการสร้าง

(crtime สำหรับระยะสั้น)

มันยากกว่านี้

ext4ขั้นแรกให้แน่ใจว่าไดเรกทอรีที่อยู่บนระบบไฟล์ที่มีรูปแบบการใช้ คุณสามารถใช้tune2fs -l <device name>เพื่อตรวจสอบสิ่งนี้

จากนั้นมีstatรูปแบบใหม่ที่เรียกว่า%Wซึ่งสามารถช่วยคุณได้ที่นี่ ในการรับมันคุณจะต้องดาวน์โหลดGNU Coreutilsรุ่นที่วางจำหน่ายในเดือนตุลาคม 2010 หรือหลังจากนั้นให้แยกรวบรวมและติดตั้ง

จากนั้นขึ้นอยู่กับเคอร์เนลของคุณสิ่งนี้อาจใช้ได้ (ยังไม่ได้ลอง)

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

ดูสิ่งนี้ด้วย:


หากคุณได้รับข้อผิดพลาดเกี่ยวกับ "'$\t'

'$\t'สัญกรณ์ต้องbashหรือzshมันจะไม่ทำงานในdashหรือshบน Ubuntu ถ้าคุณต้องการจริงๆที่จะใช้เปลือกหอยเหล่านั้นคุณจะต้องเปลี่ยนใด ๆ\tที่จะCtrl+ V, Tabและลบชั้นนำ$จากก่อนอ้างเปิด


เป็นไปได้ว่าเขาอาจไม่ได้ใช้ ext4 ฉันใช้ Ubuntu 10.04 กับทุกเครื่อง แต่เรียกใช้ JFS บนไดรฟ์หลาย ๆ ตัว AFAIK JFS รองรับการประทับเวลาในการสร้าง
jwernerny

จริง เรารู้ว่าไม่รองรับ ext3 และรองรับ ext4 การค้นหาอย่างรวดเร็วแนะนำว่ามันอาจทำงานได้กับ zfs หรือ FreeBSD ufs แต่สิ่งเหล่านั้นไม่ได้มีอยู่ใน Ubuntu! ไม่แน่ใจเกี่ยวกับ jfs หรือ xfs หรือสิ่งอื่นใด ยินดีที่จะได้ยินมากขึ้นถ้าคุณสามารถหาข้อมูล / ลิงค์
Mikel

ขอบคุณสำหรับคำตอบที่ครอบคลุมมากและเพื่อให้การแจ้งเตือนที่ละเอียดอ่อนสามารถเขียนคำถามที่เฉพาะเจาะจงมากขึ้น;) "ค้นหา" กลายเป็นผู้ชนะที่มีประสิทธิภาพการทำงาน fs-type กลายเป็น ext3

2

อีกวิธีหนึ่งหากพบว่าทำสิ่งต่าง ๆ ในวันนี้อาจเกี่ยวข้องกับปัญหาด้านประสิทธิภาพของคุณ:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

ในทางทฤษฎีควรเริ่มให้ผลลัพธ์เร็วขึ้นมาก แต่ฉันคิดว่ามันขึ้นอยู่กับว่าความล่าช้ามาจากไหน อาจใช้lsเวลานานในการจัดเรียงไฟล์


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