लिनक्स पर रिक्त स्थान वाले फ़ाइल नाम के साथ सभी फ़ाइलों को कैसे हटाएं? [डुप्लिकेट]


0

इस सवाल का पहले से ही यहाँ एक जवाब है:

मेरे स्वयं के प्रश्न को हटा नहीं सकते, इसके बजाय अधिलेखित कर सकते हैं

linux  csh 

मैंने अस्थायी फ़ाइल को संपादित करने के लिए vi का उपयोग करके खुद को सब कुछ हटाने में कामयाब रहा, यह पता लगाने के बाद कि इसमें फ़ाइल नाम भी थे जिसमें कोष्ठक शामिल थे - जो शेल को भी पसंद नहीं है ...।

जवाबों:


1

ठीक है, चलो यह उत्तरोत्तर करते हैं।

और मान लें कि आप वास्तव में हैं करना उप-श्रेणियों में भी देखना चाहते हैं, भले ही यह आपके प्रश्न में निहित हो।

पहले पास के रूप में, वाइल्डकार्ड पास करने के लिए यह केवल एक सरल अभ्यास है 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

... तो मूल रूप से, मैंने क्या लिखा है;) अच्छी व्याख्या, हालांकि मैं सबसे सुरक्षित संस्करण डालने की सलाह दूंगा चोटी पद के नीचे नहीं।
slhck

नहीं क्या मैं 2014-01-09 पर वापस लिखा गया, ट्रैकिंग प्रश्न में 1 वर्ण अंतर और सी शेल के लिए आवश्यक मामूली परिवर्तन।
JdeBP

सच है, मैंने सिर्फ यह देखा कि मैंने इसका उत्तर दिया। किस तरह का यह एक डुप्लिकेट बनाता है, खासकर जब से जवाब बिल्कुल वैसा ही है, बस एक चरित्र स्वैप करना।
slhck

मुझे आश्चर्य हुआ कि आपने इसे डुप्लिकेट के रूप में चिह्नित क्यों नहीं किया। मैंने यह सोच कर ऐसा किया कि आपके पास आपके कारण रहे होंगे। मैंने लगभग "डुप्लिकेट प्रश्न इसलिए डुप्लिकेट उत्तर दिया।" हालांकि, शीर्ष पर। (-:
JdeBP

0

क्या गलत है

rm *\ *

या

rm *' '*

या

rm *" "*

आप 'rm' करने से पहले 'ls' आज़मा सकते हैं ताकि आप सुनिश्चित कर सकें कि आप क्या कर रहे हैं।


यह पुनरावर्ती नहीं है, शायद इसीलिए ओपी का उपयोग नहीं किया rm। (ऐसा नहीं है कि यह नहीं किया जा सकता है, लेकिन ...)
slhck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.