2012-07-28 19 views
17

मैं अपनी कार्यशील निर्देशिका में कुछ प्रतीकात्मक लिंक हटाने की कोशिश कर रहा हूं, लेकिन मुझे कुछ मुद्दों का सामना करना पड़ रहा है।पायथन में एक प्रतीकात्मक लिंक कैसे हटाएं?

os.remove भी लिंक के मूल फ़ोल्डर की वास्तविक सामग्री को हटा

os.shutil सांकेतिक लिंक के मामले में एक त्रुटि निकलती है।

क्या मूल सामग्री को नष्ट किए बिना पाइथन कमांड का उपयोग करके एक प्रतीकात्मक लिंक को हटाने का कोई तरीका है?

धन्यवाद

+7

अजीब, 'os.remove()' के लिए मूल फ़ाइल को दूर नहीं करता मैं, केवल सिम्लिंक (पायथन 2.7.2 और 3.1.4 के साथ प्रयास किया)। –

+1

यह मूल फ़ाइल को नहीं हटाता है और न ही मेरे सिस्टम (पायथन 2.7.1) –

+0

सिमलिंक पर मूल्यवान दिखने वाला स्माथ: http://stackoverflow.com/a/12678252/110118 (नोट: shutil.rmtree को हटाने में विफल रहेगा os.path.osdir() के बावजूद एक लिंक, एक डीआईआर से संबंधित पथ कहता है) – mlvljr

उत्तर

20

os.unlink() मेरे लिए काम करता है। यह उस निर्देशिका को हटाए बिना सिम्लिंक को हटा देता है जो यह लिंक करता है।

+0

हाँ .. यह काम करता है धन्यवाद – akshayc11

+10

पायथन 2.7 दस्तावेज अनलिंक के बारे में कहते हैं: 'यह एक ही कार्य है जिसे हटाएं();', इसने समस्या को हल कैसे किया? –

+0

यह समाधान 'mklink/D' के माध्यम से बनाए गए निर्देशिका लिंक के लिए Windows पर काम नहीं करता है। अगर यह आपकी समस्या है तो नीचे मेरा जवाब देखें। – MOnsDaR

3

निर्देशिका का नाम स्लैश, लिनक्स rm आदेश लिंक का पालन करें और निर्देशिका को नष्ट करने की कोशिश करेंगे दें। Remove a symlink to a directory देखें। os.removedocumentation कहता है कि यदि आप निर्देशिका को निकालने का प्रयास करते हैं तो यह आपको OSError देगा लेकिन शायद यह हमेशा सिम्लिंक के मामले में नहीं होता है।

+1

यह कहता है 'ओएसईआरर: [एरर्नो 1] ऑपरेशन की अनुमति नहीं है: मेरे लिए' test/''। शायद यह कार्यान्वयन निर्भर है। –

+1

मेरे पास पाइथन आसान नहीं है। मुझे कहना चाहिए था कि यह एक अनुमान था। मैंने जवाब संपादित कर लिया है। –

+0

@JohnWatts आपका उत्तर सच है, लेकिन यह केवल शैल द्वारा बनाए गए सिम्लिंक के लिए सच है। 'os.symlink' द्वारा बनाए गए सिम्लिंक अभी भी एक ही समस्या देते हैं – akshayc11

1

क्षमा करें, मेरे खराब, मैंने एक बेवकूफ प्रोग्रामिंग गलती की थी: मैं बेवकूफ रूप से लिंक के बजाय स्रोत को हटा रहा था।

सही उत्तर @samfrances द्वारा है।

os.unlink चाल है।

इस के अलावा, यहाँ कुछ अन्य सुझाव आप अजगर का उपयोग कर एक निर्देशिका साफ़ करना चाहते हैं:

निश्चित रूप से threadsafe नहीं है, लेकिन आप अंदाजा हो ...

def rm(obj): 

    if os.path.exists(obj): 
     if os.path.isdir(obj): 
      if os.path.islink(obj): 
       os.unlink(obj) 
      else: 
       shutil.rmtree(obj) 
     else: 
      if os.path.islink(obj): 
       os.unlink(obj) 
      else: 
       os.remove(obj) 
+0

करें 'if os.path.exists (obj)' तो 'os.path.islink' अगर' os.path.isdir' करें। इस तरह आपको os.unlink दो बार करने की आवश्यकता नहीं है। – QxQ

2

स्वीकार किए जाते हैं जवाब करता है mklink /D के माध्यम से बनाए गए लिंक के साथ विंडोज पर काम नहीं करें। Delete Symlink to directory on Windows

निम्नलिखित कोड दोनों सिस्टम पर काम करना चाहिए: अगर यह आपकी समस्या है इस सवाल का जवाब इस सवाल में नियुक्त किया गया है

if(os.path.isdir(targetLink)): 
    os.rmdir(targetLink) 
else: 
    os.unlink(targetLink) 
संबंधित मुद्दे