2010-02-16 11 views
10

का उपयोग कर फ़ाइल हटाना मैं यह सुनिश्चित करना चाहता हूं कि मैं आवश्यक फाइलों को हटा दूं। मैं की तरहआरएम कमांड

dir="/some/path/" 
file = "somefile.txt" 
cmd_rm= "rm -rf "+dir + file 
os.system(cmd_rm) 

dir और file मूल्यों डेटाबेस से लाई जाती हैं, कोड कुछ है। मैं कैसे सुनिश्चित कर सकता हूं कि मैं कभी भी rm -rf / चला रहा हूं?

क्या बातें मैं rm -rf करने से पहले की जाँच करनी चाहिए?

+0

मैं तुम्हें स्पष्ट करने के लिए आप वास्तव में क्या कह रहे हैं की जरूरत है। वास्तव में आप क्या करने की कोशिश कर रहे हैं? – benno

उत्तर

25

-r स्विच का उपयोग करता है, तो आप सिर्फ एक एकल फाइल को हटाना चाहते है। साथ ही, फ़ाइल नाम में रिक्त स्थान हो सकते हैं।

बेहतर बजाय पायथन के os मॉड्यूल में कार्यों का उपयोग:

dirname = "/some/path/" 
filename = "somefile.txt" 
pathname = os.path.abspath(os.path.join(dirname, filename)) 
if pathname.startswith(dirname): 
    os.remove(pathname) 

abspath साथ पथ को सामान्य और लक्ष्य निर्देशिका के खिलाफ तुलना फ़ाइल नाम से बचा जाता है "../../../etc/passwd की तरह " या इसी के समान।

15

इसके बजाय आप os.remove() का उपयोग कर के बाद से यह आप क्या प्रयास कर रहे हैं की तुलना में एक बड़ा सौदा कम खतरनाक है सोच सकते हैं।

6

सबसे पहले, मैं आपको os.remove() और os.rmdir() कार्यों का उपयोग करने के लिए काम करने के लिए सुझाव देता हूं। कमांड रिटर्न की जांच के लिए आप अधिक पोर्टेबल कोड और कम सिरदर्द के साथ समाप्त हो जाएंगे।

यह जांचने के लिए कि आप प्रभावी रूप से निकालने का प्रयास कर रहे हैं (आप केवल "/" जांचना नहीं चाहते हैं), आप जेनरेट किए गए पथ पर कुछ नियमित अभिव्यक्तियों का उपयोग कर सकते हैं या बस डेटाबेस से लौटाए गए सभी पथों का आधार पथ जोड़ सकते हैं (आप क्या कर रहे हैं के आधार पर ...)।

+0

यदि आप नियमित अभिव्यक्ति के साथ पथ के विरुद्ध जांच करना चाहते हैं, तो पथ स्ट्रिंग के साथ एक कैननिकल और आसान-से-सौदा पाने के लिए os.path.realpath और/या os.path.normpath जैसे कुछ करना न भूलें (विशेष रूप से, os.path.realpath() के बराबर (या समकक्ष कोड जो कि रेगेक्स के साथ नहीं किया जा सकता है), आपके पास यह जानने का कोई तरीका नहीं है कि "foo/bar" वास्तव में "/") –

2

एक मॉड्यूल खोल की तरह फ़ाइल हेरफेर प्रदान करता है shutil कहा जाता है। यदि आप इसमें निर्देशिका और सभी फाइलें और निर्देशिकाएं हटाना चाहते हैं तो shutil.rmtree का उपयोग करें।

हालांकि इसे पायथन में लागू किया गया है, इसलिए यदि आप बड़ी संख्या में फाइलों को हटा रहे हैं तो आरएम स्पॉन्गिंग तेज हो सकती है, लेकिन अगर पथ में एक जगह है तो असफल हो जायेगा।

+5

को वोट देना चाहता है शटल सुझाव के लिए आप (http://docs.python.org/library/shutil.html, एक लिंक के लिए), लेकिन साथ ही रिक्त स्थान आरएम को रिक्त स्थान आदि के कारण विफल होने की आवश्यकता नहीं है (उपप्रोसेसर का उपयोग करें मॉड्यूल, मैन!), और गति लगभग निश्चित रूप से कोई मुद्दा नहीं है (स्पष्ट रूप से, पायथन धीमा नहीं है, और मुझे पूरा यकीन है कि यह ओप आमतौर पर सीपीयू-बाध्य नहीं है)। –

2

डेव किर्बी के रूप में shutil.rmtree उपयोग कहते हैं। फ़ाइलें लिखने सुनिश्चित करें कि आप लिखने की अनुमति से पहले आप इस चलाने बनाने के संरक्षित रहे हैं, तो

dir = "/some/path/" 
file = "somefile.txt" 
shutil.rmtree(dir) 

: आप निर्देशिका उपयोग हटाना चाहते हैं

dir = "/some/path/" 
file = "somefile.txt" 
cmd = os.path.join(dir, file) 
shutil.rmtree(cmd) 

: तुम सिर्फ फ़ाइल उपयोग को हटाना चाहते हैं ।

+0

हम्म, मुझे फ़ाइल के साथ rmtree का प्रयास करने में त्रुटि मिली है (हालांकि यह एक डीआईआर के साथ ठीक काम करता है)। 'OSError: [Errno 20] कोई निर्देशिका नहीं ' – Pat

+0

@Pat - आप अपनी स्क्रिप्ट को कैसे निष्पादित कर रहे हैं,' python script.py' या' python।/Script.py'? – chrissygormley

+0

आमतौर पर 'python script.py' या यहां तक ​​कि'।/Script.py' जैसे कुछ, लेकिन इस मामले में मैं वास्तव में इसे ipython REPL में कर रहा था। – Pat

0

मानते हैं कि आपका उल्लेख आरएम-आरएफ केवल यादृच्छिक नहीं है, लेकिन वास्तव में आपको जिस आदेश की आवश्यकता है, उसे कॉल क्यों न करें? एक lib है sh नामक खोल के साथ एक बड़ा एकीकरण की इजाजत देता है।

from sh import rm 

path_to_delete = '/some/path' 
if os.path.exists(path_to_delete): 
    rm('-rf', path_to_delete) 

पीएस सुनिश्चित करें कि आप रूट नहीं हैं और/या उपयोगकर्ता इनपुट के लिए अतिरिक्त सतर्क होने के लिए पूछें। और, हाँ, आदमी रिकर्सिवली एक एकल फाइल को हटाने से बचने के लिए धूम्रपान;)

संबंधित मुद्दे