อันไหนมีประสิทธิภาพมากกว่าไฟล์ชุดใหญ่มากและควรใช้?
find . -exec cmd {} +
หรือ
find . | xargs cmd
(สมมติว่าไม่มีตัวตลกในชื่อไฟล์)
อันไหนมีประสิทธิภาพมากกว่าไฟล์ชุดใหญ่มากและควรใช้?
find . -exec cmd {} +
หรือ
find . | xargs cmd
(สมมติว่าไม่มีตัวตลกในชื่อไฟล์)
คำตอบ:
ความแตกต่างของความเร็วจะไม่มีนัยสำคัญ
แต่คุณต้องแน่ใจว่า:
สคริปต์ของคุณจะไม่คิดว่าไม่มีไฟล์ใดที่จะมีช่องว่างแท็บ ฯลฯ ในชื่อไฟล์ รุ่นแรกปลอดภัยรุ่นที่สองไม่ใช่
สคริปต์ของคุณจะไม่ถือว่าไฟล์ที่ขึ้นต้นด้วย " -
" เป็นตัวเลือก
ดังนั้นรหัสของคุณควรมีลักษณะดังนี้:
find . -exec cmd -option1 -option2 -- {} +
หรือ
find . -print0 | xargs -0 cmd -option1 -option2 --
เวอร์ชันแรกนั้นสั้นกว่าและเขียนง่ายกว่าเนื่องจากคุณสามารถเพิกเฉยต่อ 1 ได้ แต่เวอร์ชันที่สองนั้นพกพาได้และปลอดภัยกว่าเนื่องจาก " -exec cmd {} +
" เป็นตัวเลือกที่ค่อนข้างใหม่ในการค้นหา GNU (ตั้งแต่ปี 2005 ระบบที่ทำงานอยู่จำนวนมากจะยังไม่มี) และมันก็เป็นรถเมื่อเร็ว ๆ นี้ นอกจากนี้ผู้คนจำนวนมากไม่ทราบ " -exec cmd {} +
" ดังที่คุณเห็นจากคำตอบอื่น ๆ
exec
จะแสดงผลลัพธ์ตามที่พบในขณะที่xargs
ดูเหมือนว่ารอจนกว่าจะค้นหาไดเรกทอรีทั้งหมดก่อนที่จะเขียนถึง stdout หากคุณกำลังลองสิ่งนี้ในไดเร็กทอรีขนาดใหญ่และดูเหมือนว่าxargs
จะไม่ได้ผลขอแนะนำให้ใช้ความอดทน
-print0
find ส่งคืนชื่อไฟล์ที่คั่นด้วยขึ้นบรรทัดใหม่ แต่การขึ้นบรรทัดใหม่ยังสามารถเป็นส่วนหนึ่งของชื่อไฟล์ทำให้ไม่ชัดเจน ไบต์ 0 ไม่ได้ดังนั้นจึงเป็นตัวคั่นที่ปลอดภัย ใช่ - การเพิ่ม--
คำสั่งที่สนับสนุนเป็นแนวทางปฏิบัติที่ดีเมื่อคุณไม่สามารถควบคุมอาร์กิวเมนต์ได้แม้ว่าจะไม่จำเป็นอย่างเคร่งครัดหรือไม่ปลอดภัยก็ตาม
find . | xargs cmd
มีประสิทธิภาพมากขึ้น (วิ่งcmd
น้อยที่สุดเท่าที่จะเป็นไปได้ซึ่งแตกต่างจากexec
ที่ทำงานcmd
ครั้งเดียวในแต่ละนัด) อย่างไรก็ตามคุณจะประสบปัญหาหากชื่อไฟล์มีช่องว่างหรืออักขระขี้ขลาด
แนะนำให้ใช้สิ่งต่อไปนี้:
find . -print0 | xargs -0 cmd
สิ่งนี้จะใช้งานได้แม้ว่าชื่อไฟล์จะมีอักขระขี้ขลาด ( -print0
ทำให้find
พิมพ์การจับคู่ที่สิ้นสุดด้วย NUL -0
ทำให้xargs
คาดว่าจะมีรูปแบบนี้)
xargs
วิธีนี้จะช้าลงอย่างมากหากไม่มีไฟล์ที่ตรงกัน (หรือเพียงไม่กี่ไฟล์) และcmd
ไม่มีอะไรให้ทำมากนักสำหรับแต่ละไฟล์ ตัวอย่างเช่นเมื่อรันในไดเร็กทอรีว่างxargs
เวอร์ชันจะใช้เวลาอย่างน้อยสองเท่าเนื่องจากต้องเริ่มกระบวนการสองกระบวนการแทนที่จะเป็นเพียงกระบวนการเดียว (ใช่ความแตกต่างมักมองไม่เห็นใน * nix แต่ในการวนซ้ำอาจมีความสำคัญหรือลองใช้ Windows สักระยะ ... )
xargs
เวอร์ชันสมัยใหม่มักรองรับการดำเนินการไปป์ไลน์แบบขนาน
เห็นได้ชัดว่ามันอาจเป็นจุดหมุนเมื่อต้องเลือกระหว่าง
find … -exec
และ
… | xargs