आपने जो लिखा है, वह न्यूलाइन से अलग फाइल नामों (और रास्तों) की एक सूची भेजता है rm, लेकिन आरएम को यह नहीं पता है कि उस इनपुट का क्या करना है। यह केवल कमांड लाइन मापदंडों की अपेक्षा कर रहा है।
xargs इनपुट लेता है, आमतौर पर न्यूलाइन द्वारा अलग किया जाता है, और उन्हें कमांड लाइन पर रखता है, इसलिए xargs को जोड़ने से आपके पास काम होता है:
find . -name .svn | xargs rm -fr
xargsपर्याप्त बुद्धिमान है कि यह केवल उतने ही तर्कों को पारित करेगा जितना कि इसे rmस्वीकार कर सकते हैं। इस प्रकार, यदि आपके पास एक लाख फाइलें हैं, तो वह rm1,000,000 / 65,000 बार चल सकती है (यदि आपका शेल कमांड लाइन पर 65,002 तर्क स्वीकार कर सकता है {65k फाइलें + 1 rm + 1 for -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 {} +
अंतिम खोज / xargs संस्करण Print0 का उपयोग करता है, जो \0एक आउटपुट उत्पन्न करता है जो एक नई रेखा के बजाय एक टर्मिनेटर के रूप में उपयोग करता है । चूंकि POSIX सिस्टम किसी भी वर्ण को अनुमति देता है \0, लेकिन फ़ाइल नाम में, यह वास्तव में यह सुनिश्चित करने का सबसे सुरक्षित तरीका है कि तर्कों को सही ढंग से पारित किया जाता है rmया एप्लिकेशन निष्पादित किया जा रहा है।
इसके अलावा, वहाँ एक है -execdirजो rmउस निर्देशिका से निष्पादित करेगा जिसमें फ़ाइल को आधार निर्देशिका के बजाय पाया गया था और जो -depthपहले गहराई शुरू करेगी।