มีการ จำกัด สูงสุดว่ารายการอาร์กิวเมนต์สามารถใช้ได้นานแค่ไหนสำหรับคำสั่งของระบบ - ข้อ จำกัด นี้เป็นแบบเฉพาะ distro โดยขึ้นอยู่กับค่าMAX_ARG_PAGES
เมื่อเคอร์เนลถูกคอมไพล์และไม่สามารถเปลี่ยนแปลงได้โดยไม่ต้องคอมไพล์เคอร์เนลใหม่
เนื่องจากวิธีจัดการแบบกลมโดยเชลล์สิ่งนี้จะส่งผลต่อคำสั่งระบบส่วนใหญ่เมื่อคุณใช้อาร์กิวเมนต์เดียวกัน ("* .jpg") เนื่องจากเชลล์ประมวลผลโดยเชลล์ก่อนจากนั้นจึงส่งไปยังคำสั่งคำสั่ง:
cp -uf *.jpg /targetdir/
โดยพื้นฐานแล้วเหมือนกับเชลล์เหมือนกับที่คุณเขียน:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
หากคุณกำลังจัดการกับ jpegs จำนวนมากสิ่งนี้อาจกลายเป็นสิ่งที่ไม่สามารถจัดการได้อย่างรวดเร็ว ขึ้นอยู่กับหลักการตั้งชื่อของคุณและจำนวนไฟล์ที่คุณต้องดำเนินการจริง ๆ คุณสามารถเรียกใช้คำสั่งcpบนเซ็ตย่อยอื่นของไดเรกตอรีในแต่ละครั้ง:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
สิ่งนี้สามารถใช้งานได้ แต่วิธีการที่มีประสิทธิภาพนั้นขึ้นอยู่กับว่าคุณสามารถแบ่งรายชื่อไฟล์ของคุณให้เป็นบล็อกก้อนกลมที่สะดวกได้อย่างไร
Globbable ฉันชอบคำนั้น
คำสั่งบางคำสั่งเช่นfindและxargsสามารถจัดการรายการไฟล์ขนาดใหญ่ได้โดยไม่ต้องสร้างรายการอาร์กิวเมนต์ขนาดที่เจ็บปวด
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
อาร์กิวเมนต์ -exec จะรันส่วนที่เหลือของบรรทัดคำสั่งหนึ่งครั้งสำหรับแต่ละไฟล์ที่พบโดยfindโดยแทนที่ {} ด้วยชื่อไฟล์ที่พบ เนื่องจากคำสั่งcpรันเพียงไฟล์เดียวในแต่ละครั้งขีด จำกัด รายการอาร์กิวเมนต์จึงไม่เป็นปัญหา
อาจช้าเนื่องจากต้องดำเนินการแต่ละไฟล์แยกกัน การใช้xargsสามารถมอบโซลูชันที่มีประสิทธิภาพมากขึ้น:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargsสามารถนำรายชื่อไฟล์ทั้งหมดที่มีให้โดยfindและแบ่งออกเป็นรายการอาร์กิวเมนต์ที่มีขนาดที่สามารถจัดการได้และเรียกใช้cpในแต่ละรายการย่อย
แน่นอนนอกจากนี้ยังมีความเป็นไปได้เพียง recompiling MAX_ARG_PAGES
เคอร์เนลของคุณการตั้งค่าขนาดใหญ่ แต่การคอมไพล์เคอร์เนลใหม่นั้นทำงานได้ดีกว่าที่ฉันเต็มใจจะอธิบายในคำตอบนี้