इस सवाल का पहले से ही यहाँ एक जवाब है:
मेरे स्वयं के प्रश्न को हटा नहीं सकते, इसके बजाय अधिलेखित कर सकते हैं
इस सवाल का पहले से ही यहाँ एक जवाब है:
मेरे स्वयं के प्रश्न को हटा नहीं सकते, इसके बजाय अधिलेखित कर सकते हैं
जवाबों:
ठीक है, चलो यह उत्तरोत्तर करते हैं।
और मान लें कि आप वास्तव में हैं करना उप-श्रेणियों में भी देखना चाहते हैं, भले ही यह आपके प्रश्न में निहित हो।
पहले पास के रूप में, वाइल्डकार्ड पास करने के लिए यह केवल एक सरल अभ्यास है find आदेश, यह निश्चित रूप से उद्धृत करने के लिए याद है, और निष्पादित rm प्रत्येक फ़ाइल के लिए कमांड मिली:
find $BASE_DIR/ -name '* *' -exec rm {} \;
लेकिन निश्चित रूप से यह बहुत ही अयोग्य है। यह एक पूरे शुरू होता है rm प्रत्येक व्यक्तिगत फ़ाइल के लिए प्रक्रिया। इसलिए जब हम थोड़ा चक्कर लगा सकते थे \+ यह वह जगह नहीं है जहां हम समाप्त होने जा रहे हैं, इसलिए चलो छोटा रास्ता लें और अंदर लाएं xargs समूहों में फ़ाइल नाम रखने के लिए:
find $BASE_DIR/ -name '* *' -print | xargs rm
लेकिन इसमें दो सुरक्षा छेद हैं। सबसे पहले, यदि कोई फ़ाइल नाम पाया जाता है तो एक ऋण चिह्न के साथ शुरू होता है rm इसे फ़ाइल नाम के बजाय कमांड-लाइन विकल्प के रूप में माना जाएगा, और एक त्रुटि उत्पन्न करेगा। ( -exec rm {} संस्करण में भी यह समस्या है।) दूसरा, व्हॉट्सएप वाले फ़ाइलनाम को ठीक से नियंत्रित नहीं किया जाएगा xargs, जैसा कि आपने देखा है। इसलिए इसे और अधिक बुलेटप्रूफ बनाने के लिए एक और चलना है:
find $BASE_DIR/ -name '* *' -print0 | xargs -0 rm --
और, ज़ाहिर है, की इंटरैक्टिव विशेषताएं हैं rm जो आप शायद नहीं चाहते हैं:
find $BASE_DIR/ -name '* *' -print0 | xargs -0 rm -f --
-print0 तथा -0 विकल्प मानक नहीं हैं, लेकिन GNU है find तथा xargs, साथ ही FreeBSD find तथा xargs, उन्हें समझें। हालांकि, यहां तक कि यह कामचलाऊ है। हमें किसी भी अतिरिक्त प्रक्रिया को पूरा करने की आवश्यकता नहीं है। जीएनयू और फ्रीबीएसडी find दोनों ही आह्वान कर सकते हैं unlink(2) सिस्टम कॉल सीधे:
find $BASE_DIR/ -name '* *' -delete
अंतिम निवारक उपाय के रूप में आपको कुछ विशेष परिस्थितियों में आपकी आवश्यकता से अधिक करने से रोकने के लिए, याद रखें कि फाइलसिस्टम में केवल नियमित फ़ाइलों से अधिक हो सकता है:
find $BASE_DIR/ -name '* *' -type f -delete