2012-11-19 16 views
6

पर ज़िप फ़ोल्डर सामग्री की सुंदरता की तुलना कैसे करें यह परिदृश्य है। मैं एक पायथन लिपि का उपयोग कर फ़ोल्डर की सामग्री बैकअप करने में सक्षम होना चाहता हूँ। हालांकि, मैं चाहता हूं कि मेरे बैकअप को ज़िपित प्रारूप में संग्रहीत किया जाए, संभवतः bz2।अनजिप किए गए फ़ोल्डर सामग्री

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

मेरे प्रक्रिया इस तरह होगा:

  1. बैकअप करता हूं तो क्या हाल ही में ज़िपित बैकअप
  2. ही हैं में संग्रहित है के खिलाफ "वर्तमान" फ़ोल्डर की
  3. चेक सामग्री - फिर "पूरा"
  4. अलग है, तो बैकअप चलाने के लिए, फिर "पूरा"

किसी को सबसे विश्वसनीय recomment कर सकते हैं और चरण 2 को पूरा करने का सरल तरीका? क्या मुझे तुलना करने के लिए एक अस्थायी निर्देशिका में बैकअप और स्टोर की सामग्री को अनजिप करना है या ऐसा करने का एक और शानदार तरीका है? संभवतः संशोधित तारीख के साथ क्या करना है?

उत्तर

4

ज़िप फ़ाइलों में सीआरसी 32 चेकसम शामिल हैं और आप उन्हें पायथन ज़िपफाइल मॉड्यूल के साथ पढ़ सकते हैं: http://docs.python.org/2/library/zipfile.html। आप ZipFile.infolist() से सीआरसी सदस्यों के साथ ZipInfo ऑब्जेक्ट्स की एक सूची प्राप्त कर सकते हैं। ZipInfo ऑब्जेक्ट में संशोधन तिथियां भी हैं।

आप अनपॅक किए गए फ़ाइलों के लिए गणना चेकसम के साथ ज़िप चेकसम की तुलना कर सकते हैं। आपको अनपॅक की गई फ़ाइलों को पढ़ने की आवश्यकता है लेकिन आप सब कुछ डिकंप्रेस करने से बचें।

सीआरसी 32 क्रिप्टोग्राफिक चेकसम नहीं है, लेकिन यदि आपको आवश्यकता हो तो परिवर्तनों की जांच करना पर्याप्त होना चाहिए।

यह ज़िप फ़ाइलों के लिए है। अन्य संग्रह प्रारूप (जैसे tar.bz2) में ऐसे आसानी से सुलभ मेटाडेटा नहीं हो सकता है।

+0

यह एक अच्छा विचार है। आपको फिर से सभी फाइलें पढ़नी पड़ेगी, लेकिन यह आपको लिखने से बचाएगी। – invert

1

रुपएसी स्वचालित रूप से संशोधित फ़ाइलों की प्रतिलिपि बनायेगा और केवल कॉपी करेगा, लेकिन परिणाम देखने के लिए आप अभी भी यह जानना चाहते हैं कि कुछ भी बदल गया है या नहीं।

आपके संग्रह के साथ एक टेक्स्ट फ़ाइल में निर्देशिका सूची (टाइम टिकटें सहित) को आउटपुट करने के बारे में आप कैसे हैं। अगली बार जब आप diff इस संग्रहीत पाठ के विरुद्ध वर्तमान निर्देशिका संरचना। आप इस फ़ाइल सूची को include उन बदली गई फ़ाइलों पर भिन्नता से grep कर सकते हैं और पाइप कर सकते हैं।

1) आरंभ बैकअप

2) भागो बैकअप

3) की तुलना दोनों कंप्रेस फ़ाइलों:

import filecmp 
filecmp.cmp(Compressed_new_file, Compressed_old_file, shallow=True) 

4) एक ही

+0

क्या संग्रह से सामग्री निकालने के बिना किसी संग्रह में फ़ाइल के टाइमस्टैम्प को जांचने का कोई तरीका है? इस तरह से मैं फ़ाइल से बच सकता है। – Jimmy

+0

जांचें कि क्या आपकी bzip 'सूची संग्रह सामग्री 'क्रिया संशोधित समय दिखाती है। यदि ऐसा नहीं होता है, तो फ़ाइल में अपने अंतिम संग्रह का समय संग्रहीत करने पर विचार करें, और उसके खिलाफ जांच करें। – invert

1

आप निम्न प्रक्रिया की कोशिश कर सकते - नई बैकअप फ़ाइल हटाएं, फिर "पूर्ण"

5) अन्यथा "com plete "

नोट: मामले में आप सिर्फ संशोधनों के बीच के समय जांच करने की जरूरत है, तो आप इसके बजाय फ़ोल्डर decompressing और अलग-अलग फ़ाइलों की तुलना से this documentation

पर एक नज़र हो सकता है, मुझे लगता है कि यह तुलना करने के लिए आसान हो सकता है संकुचित फाइलें। कुल मिलाकर मुझे लगता है (ठीक है, यह सिर्फ एक अंतर्ज्ञान है: डी) यह बेहतर होगा कि जब आप स्क्रिप्ट चलाते हैं तो फ़ोल्डर की सामग्री

1

मैं इस स्क्रिप्ट का उपयोग केवल निर्देशिका के संपीड़न बैकअप बनाने के लिए करता हूं जब अंतिम बैकअप के बाद निर्देशिका सामग्री बदल जाती है।

मैं बैकअप फ़ाइल के पाचन को संग्रहीत करने के लिए बाहरी एमडी 5 फ़ाइल का उपयोग करता हूं और मैं निर्देशिका परिवर्तनों का पता लगाने के लिए जांचता हूं।

import hashlib 
import tarfile 
import bz2 
import cStringIO 
import os 

def backup_dir(dirname, backup_path): 
    fobj = cStringIO.StringIO() 
    t = tarfile.open(mode='w',fileobj=fobj) 
    t.add(dirname) 
    t.close() 
    buf = fobj.getvalue() 
    new_md5 = hashlib.md5(buf).digest() 

    if os.path.isfile(backup_path + '.md5'): 
     old_md5 = open(backup_path + '.md5').read() 
    else: 
     old_md5 = '' 

    if new_md5 <> old_md5: 
     open(backup_path, 'wb').write(bz2.compress(buf)) 
     open(backup_path + '.md5', 'wb').write(new_md5) 
     print 'backup done!' 
    else: 
     print 'nothing to do' 
संबंधित मुद्दे