สิ่งที่คุณเขียนจะส่งรายการชื่อไฟล์ที่คั่นด้วยบรรทัดใหม่ (และพา ธ ) ไปยังrm
แต่ rm ไม่ทราบว่าต้องทำอะไรกับอินพุตนั้น เป็นเพียงการคาดหวังว่าพารามิเตอร์บรรทัดคำสั่งเท่านั้น
xargs
รับอินพุตโดยปกติคั่นด้วยบรรทัดใหม่และวางลงในบรรทัดคำสั่งดังนั้นการเพิ่ม xargs ทำให้สิ่งที่คุณใช้งาน:
find . -name .svn | xargs rm -fr
xargs
ฉลาดพอที่จะส่งผ่านการโต้แย้งได้มากrm
เท่าที่จะยอมรับได้ ดังนั้นหากคุณมีไฟล์เป็นล้านไฟล์มันอาจรันrm
1,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
ที่จะเริ่มลึกก่อน