สิ่งที่คุณเขียนจะส่งรายการชื่อไฟล์ที่คั่นด้วยบรรทัดใหม่ (และพา ธ ) ไปยังrmแต่ rm ไม่ทราบว่าต้องทำอะไรกับอินพุตนั้น เป็นเพียงการคาดหวังว่าพารามิเตอร์บรรทัดคำสั่งเท่านั้น
xargs รับอินพุตโดยปกติคั่นด้วยบรรทัดใหม่และวางลงในบรรทัดคำสั่งดังนั้นการเพิ่ม xargs ทำให้สิ่งที่คุณใช้งาน:
find . -name .svn | xargs rm -fr
xargsฉลาดพอที่จะส่งผ่านการโต้แย้งได้มากrmเท่าที่จะยอมรับได้ ดังนั้นหากคุณมีไฟล์เป็นล้านไฟล์มันอาจรันrm1,000,000 / 65,000 ครั้ง (หากเชลล์ของคุณสามารถยอมรับอาร์กิวเมนต์ 65,002 บนบรรทัดคำสั่ง {65k ไฟล์ + 1 สำหรับ rm + 1 สำหรับ -fr})
เมื่อบุคคลมีความเชี่ยวชาญชี้ให้เห็นต่อไปนี้ยังทำงาน:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
สอง-execรูปแบบแรกทั้งสองเรียกrmสำหรับแต่ละโฟลเดอร์ที่ถูกลบดังนั้นหากคุณมี 1,000,000 โฟลเดอร์rmจะถูกเรียก 1,000,000 ครั้ง แน่นอนว่ามันน้อยกว่าอุดมคติ การนำไปใช้ใหม่จะrmช่วยให้คุณสามารถสรุปคำสั่งด้วยการ+ระบุว่าrmจะยอมรับข้อโต้แย้งได้มากที่สุด:
find . -name .svn -exec rm -rf {} +
เวอร์ชัน find / xargs ล่าสุดใช้ print0 ซึ่งทำให้ find create output ที่ใช้\0เป็น terminator แทนที่จะขึ้นบรรทัดใหม่ เนื่องจากระบบ POSIX อนุญาตให้ใช้อักขระใดก็ได้ แต่\0ในชื่อไฟล์นี่เป็นวิธีที่ปลอดภัยที่สุดอย่างแท้จริงเพื่อให้แน่ใจว่าอาร์กิวเมนต์จะถูกส่งผ่านอย่างถูกต้องไปยังrmแอปพลิเคชันที่ถูกเรียกใช้
นอกจากนี้ยังมีสิ่ง-execdirที่จะดำเนินการrmจากไดเรกทอรีที่พบไฟล์มากกว่าที่ไดเรกทอรีฐานและ-depthที่จะเริ่มลึกก่อน