การรวมกันของfind
และls
ทำงานได้ดีสำหรับ
- ชื่อไฟล์ที่ไม่มีบรรทัดใหม่
- ไฟล์มีไม่มาก
- ชื่อไฟล์ไม่ยาวมาก
การแก้ไขปัญหา:
find . -name "my-pattern" -print0 |
xargs -r -0 ls -1 -t |
head -1
มาทำลายมันกันเถอะ:
ด้วยfind
เราสามารถจับคู่ไฟล์ที่น่าสนใจเช่นนี้ทั้งหมด:
find . -name "my-pattern" ...
จากนั้นใช้-print0
เราสามารถส่งต่อชื่อไฟล์ทั้งหมดได้อย่างปลอดภัยls
เช่นนี้:
find . -name "my-pattern" -print0 | xargs -r -0 ls -1 -t
สามารถเพิ่มfind
พารามิเตอร์และรูปแบบการค้นหาเพิ่มเติมได้ที่นี่
find . -name "my-pattern" ... -print0 | xargs -r -0 ls -1 -t
ls -t
จะเรียงลำดับไฟล์ตามเวลาที่แก้ไข (ใหม่สุดก่อน) และพิมพ์ทีละบรรทัด คุณสามารถใช้-c
เพื่อจัดเรียงตามเวลาที่สร้าง หมายเหตุ : สิ่งนี้จะแตกด้วยชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่
ในที่สุดก็head -1
ทำให้เราเป็นไฟล์แรกในรายการเรียงลำดับ
หมายเหตุ: xargs
ใช้ระบบ จำกัด ขนาดของรายการอาร์กิวเมนต์ หากขนาดนี้เกินxargs
จะเรียกls
หลายครั้ง สิ่งนี้จะทำลายการเรียงลำดับและอาจเป็นผลลัพธ์สุดท้าย วิ่ง
xargs --show-limits
เพื่อตรวจสอบข้อ จำกัด ในระบบของคุณ
หมายเหตุ 2:ใช้find . -maxdepth 1 -name "my-pattern" -print0
หากคุณไม่ต้องการค้นหาไฟล์ผ่านโฟลเดอร์ย่อย
หมายเหตุ 3:ในฐานะที่เป็นแหลมออกโดย @starfry - -r
อาร์กิวเมนต์สำหรับการxargs
ป้องกันไม่ให้การเรียกร้องของถ้าไม่มีแฟ้มที่ถูกจับคู่โดยls -1 -t
find
ขอบคุณสำหรับข้อเสนอแนะ