आपने जो लिखा है, वह न्यूलाइन से अलग फाइल नामों (और रास्तों) की एक सूची भेजता है rm
, लेकिन आरएम को यह नहीं पता है कि उस इनपुट का क्या करना है। यह केवल कमांड लाइन मापदंडों की अपेक्षा कर रहा है।
xargs
इनपुट लेता है, आमतौर पर न्यूलाइन द्वारा अलग किया जाता है, और उन्हें कमांड लाइन पर रखता है, इसलिए xargs को जोड़ने से आपके पास काम होता है:
find . -name .svn | xargs rm -fr
xargs
पर्याप्त बुद्धिमान है कि यह केवल उतने ही तर्कों को पारित करेगा जितना कि इसे rm
स्वीकार कर सकते हैं। इस प्रकार, यदि आपके पास एक लाख फाइलें हैं, तो वह rm
1,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
पहले गहराई शुरू करेगी।