2011-01-31 3 views
21

में एक प्रतीकात्मक लिंक की प्रतिलिपि बनाना मैं src को dst पर एक फ़ाइल कॉपी करना चाहता हूं, लेकिन src एक प्रतीकात्मक लिंक होता है, तो फ़ाइल की सामग्री की प्रतिलिपि बनाने के बजाय लिंक को सुरक्षित रखें। प्रतिलिपि के बाद, os.readlink को src और dst दोनों के लिए समान रूप से वापस करना चाहिए।पायथन

मॉड्यूल shutil कई काम करता है, इस तरह के copyfile, copy और copy2, लेकिन इन सब के रूप में सामग्री फ़ाइल का कॉपी जाएगा, और लिंक को सुरक्षित नहीं करेगा है। shutil.move में सही व्यवहार है, तथ्य यह है कि यह मूल फ़ाइल को हटा देता है।

क्या सिथिंक को संरक्षित करते समय पाइथन में फ़ाइल प्रतिलिपि करने का एक अंतर्निहित तरीका है?

उत्तर

38

बस

def copy(src, dst): 
    if os.path.islink(src): 
     linkto = os.readlink(src) 
     os.symlink(linkto, dst) 
    else: 
     shutil.copy(src,dst) 

shutil.copytree कुछ ऐसा ही करते हैं, लेकिन के रूप में senderle बताया गया है, यह केवल निर्देशिका, नहीं एकल फ़ाइलों को कॉपी बारे में चयन है।

+1

मैंने ऐसा करने के लिए 'copytree' का उपयोग करने का प्रयास किया और मुझे एक ओएसईआरआर शिकायत मिली कि 'src' निर्देशिका नहीं थी; मुझे लगता है कि 'os.path.islink' की जांच वास्तव में एकमात्र तरीका है। – senderle

+1

ऐसा लगता है कि यह अजीब है कि फ़ाइलों की प्रतिलिपि बनाने के लिए कोई समर्पित फ़ंक्शन नहीं है (कॉपीट्री की तरह निर्देशिकाओं की बजाय) जो उन्हें हल करने के बजाय सिम्लिंक को संरक्षित करता है, लेकिन मुझे कोई भी नहीं मिला। ऐसा लगता है कि यह एकमात्र तरीका है ... –