การรวมกันของ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ขอบคุณสำหรับข้อเสนอแนะ