2010-02-15 27 views
5

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

import os 
import shutil 

shutil.copy2 (src, dst) 
#... many more shutil.copy commands 
#src is a filename string 
#dst is the directory where the file is to be copied 

मेरे समस्या की नकल की है कि फ़ाइलों के कई किया जा रहा है बड़ी फ़ाइलों, और उन सभी नहीं फिर से संकलित किया गया है कि हर संकलन चक्र में है: क्या मैं इस समय काफी सरल है, कुछ इस तरह। आदर्श रूप से, मैं इस स्क्रिप्ट में केवल बदली गई फ़ाइलों की प्रतिलिपि बनाना चाहता हूं। क्या कोई और तरीका है इसे करने के लिए?

उत्तर

9

आप फ़ाइल संशोधन समय का उपयोग कर सकता दे सकता है, अगर है कि आप के लिए काफी है:

# If more than 1 second difference 
if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1: 
    shutil.copy2 (src, dst) 

या एक तुल्यकालन फोन rsync जैसे उपकरण।

+3

क्यों '> 1' - कि नहीं होना चाहिए'> 0'? – Wikis

+0

उपयोग के मामले पर निर्भर करता है, मुझे लगता है। अगर फ़ाइलों को हमेशा 'shutil.copy2' के साथ लिखा जाता है, तो संशोधन समय को बराबर बराबर होने की उम्मीद की जा सकती है (फिर यह'> 0') है। – AndiDog

4

यदि आपके पास पाइथन में इसे कोड करने की आवश्यकता के लिए कोई निश्चित कारण नहीं है, तो मैं rsync का उपयोग करने का सुझाव दूंगा। इसके मैन-पेज से:

रुनक एक तेज और असाधारण बहुमुखी फ़ाइल प्रतिलिपि उपकरण है। यह अपने डेल्टा-हस्तांतरण एल्गोरिथ्म, जो केवल गंतव्य में स्रोत फ़ाइलें और मौजूदा फ़ाइलों के बीच मतभेद भेजकर नेटवर्क पर भेजी गई डेटा की मात्रा कम कर देता है के लिए प्रसिद्ध है।

आप अजगर में इस कोड को करना चाहते हैं अगर, हालांकि, तो जगह शुरू करने के लिए अध्ययन करने के लिए filecmp.cmp

1

आप कैसे बदली हुई फाइलों को देखने के लिए चाहते हैं हो सकता है? आप src पर os.path.getmtime (पथ) का उपयोग कर सकते हैं और जांच सकते हैं कि यह कुछ संग्रहीत टाइमस्टैम्प (पिछली बार जब आपने उदाहरण के लिए कॉपी किया था) से नया है या फ़ाइलcmp.cmp (f1, f2 [, उथला]) का उपयोग करने के लिए जांचें क्या एक फाइल नई है।

filecmp.cmp के साथ देखें, आप भी stat (copy2) की प्रतिलिपि बनाते हैं ताकि आपको गीले की जांच करनी पड़े तुलनात्मक रूप से आपके लिए पर्याप्त हो।

1

AndiDog के जवाब से:

os.stat(dst).st_mtime - os.stat(src).st_mtime 

अगर 'src' फ़ाइल नया है एक नकारात्मक मूल्य है, इसलिए यह होना चाहिए:

if os.stat(src).st_mtime - os.stat(dst).st_mtime > 1: 
2

आप एक स्मार्ट प्रतिलिपि distutils.file_util.copy_file उपयोग कर सकते हैं की स्थापना द्वारा वैकल्पिक तर्क: update=1

0

AndiDog के जवाब पर निर्माण करने के लिए, आप फ़ाइलों को गंतव्य फ़ोल्डर में मौजूद नहीं हो सकता है, तो:

# copy file if destination is older by more than a second, or does not exist 
if (not os.path.exists(dest)) or (os.stat(src).st_mtime - os.stat(dest).st_mtime > 1) : 
    shutil.copy2 (src, dest) 
संबंधित मुद्दे