आप दो फ़ोल्डरों की तुलना कैसे करते हैं और तीसरे फ़ोल्डर में अंतर की प्रतिलिपि कैसे बनाते हैं?


23

आपको तीन फ़ोल्डर मिले हैं:

  • फ़ोल्डर करंट , जिसमें आपकी वर्तमान फाइलें हैं
  • फ़ोल्डर पुराना , जिसमें समान फ़ाइलों का पुराना संस्करण है
  • फ़ोल्डर अंतर , जो सिर्फ एक खाली फ़ोल्डर है

तुम कैसे तुलना करते हैं वर्ष के साथ वर्तमान और फ़ाइलों जिसमें अलग (या पूरी तरह से नया) कर रहे हैं नकल वर्तमान के अंतर ?


मैंने चारों ओर खोज की है और ऐसा लगता है कि इससे निपटना एक साधारण बात है, लेकिन मैं इसे अपने विशेष उदाहरण में काम करने के लिए नहीं पा सकता हूं। अधिकांश स्रोतों ने rsync के उपयोग का सुझाव दिया इसलिए मैंने निम्नलिखित कमांड के साथ समाप्त किया:

rsync -ac --compare-dest=../old/ new/ difference/

हालांकि यह क्या करता है, सभी फाइलों को नए से अंतर तक कॉपी किया जाता है , यहां तक ​​कि जो पुराने में समान हैं ।

मामले में यह मदद करता है (हो सकता है कि कमांड ठीक हो और गलती कहीं और हो), इस तरह से मैंने यह परीक्षण किया है:

  1. मैंने तीन फोल्डर बनाए।
  2. मैंने पुराने में विभिन्न सामग्रियों के साथ कई पाठ फाइलें बनाईं ।
  3. मैंने पुरानी से नई फाइलों को कॉपी किया ।
  4. मैंने कुछ फ़ाइलों की सामग्री को नए में बदल दिया और कुछ अतिरिक्त फ़ाइलों को जोड़ा।
  5. मैंने उपरोक्त कमांड को चलाया और परिणामों को अंतर में जांचा ।

मैं पिछले कुछ दिनों के लिए एक समाधान के लिए देख रहा हूँ और मैं वास्तव में कुछ मदद की सराहना करेंगे। यह जरूरी नहीं कि rsync का उपयोग किया जाना चाहिए, लेकिन मैं यह जानना चाहूंगा कि यदि संभव हो तो मैं क्या गलत कर रहा हूं।



@wingedsubmariner मुझे नहीं लगता कि यह एक डुप्लिकेट है, क्योंकि लिंक किए गए प्रश्न पर स्वीकृत उत्तर के रूप में, ओपी के बारे में एक प्रश्न पूछ रहा है जो कमांड है।
बर्नहार्ड

@ बर्नहार्ड आह, मेरा बुरा। मुझे लगता है कि मैंने मूल प्रश्न को गलत समझा।
विंगड्यूसबम्बर 18

@wingedsubmariner कोई चिंता नहीं है, आपने कहा "संभव", और मैं मानता हूं कि यह बहुत समान दिखता है :)
बर्नहार्ड

जवाबों:


7

मुझे यकीन नहीं है कि आप इसे किसी भी मौजूदा linux कमांड जैसे rsync या डिफरेंट के साथ कर सकते हैं। लेकिन मेरे मामले में मुझे पायथन का उपयोग करके अपनी स्क्रिप्ट लिखनी पड़ी, क्योंकि फ़ाइल तुलना के लिए अजगर के पास "फाइलकैप" मॉड्यूल है। मैंने अपनी व्यक्तिगत साइट में पूरी स्क्रिप्ट और उपयोग पोस्ट किया है - http://linuxfreelancer.com/

यह उपयोग सरल है - इसे उस क्रम में नई निर्देशिका, पुरानी निर्देशिका और अंतर निर्देशिका का पूर्ण पथ दें।

#!/usr/bin/env python

import os, sys
import filecmp
import re
from distutils import dir_util
import shutil
holderlist=[]

def compareme(dir1, dir2):
    dircomp=filecmp.dircmp(dir1,dir2)
    only_in_one=dircomp.left_only
    diff_in_one=dircomp.diff_files
    dirpath=os.path.abspath(dir1)
    [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in only_in_one]
    [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:
        for item in dircomp.common_dirs:
            compareme(os.path.abspath(os.path.join(dir1,item)), os.path.abspath(os.path.join(dir2,item)))
        return holderlist

def main():
 if len(sys.argv) > 3:
   dir1=sys.argv[1]
   dir2=sys.argv[2]
   dir3=sys.argv[3]
 else:
   print "Usage: ", sys.argv[0], "currentdir olddir difference"
   sys.exit(1)

 if not dir3.endswith('/'): dir3=dir3+'/'

 source_files=compareme(dir1,dir2)
 dir1=os.path.abspath(dir1)
 dir3=os.path.abspath(dir3)
 destination_files=[]
 new_dirs_create=[]
 for item in source_files:
   destination_files.append(re.sub(dir1, dir3, item) )
 for item in destination_files:
  new_dirs_create.append(os.path.split(item)[0])
 for mydir in set(new_dirs_create):
   if not os.path.exists(mydir): os.makedirs(mydir)
#copy pair
 copy_pair=zip(source_files,destination_files)
 for item in copy_pair:
   if os.path.isfile(item[0]):
    shutil.copyfile(item[0], item[1])

if __name__ == '__main__':
 main()

21

मुझे पता चला है कि मेरे मामले में क्या समस्या थी:

मैं जिन फाइलों की तुलना कर रहा था, उनमें अलग-अलग टाइमस्टैम्प्स थे। मुझे -a तर्क का उपयोग नहीं करना चाहिए था , मुझे लगता है क्योंकि rsync फाइलों को कॉपी करते समय टाइमस्टैम्प को संरक्षित करने की कोशिश कर रहा था। मेरे लिए काम करने वाली कमान थी:

rsync -rvcm --compare-dest=../old/ new/ difference/

मुझे लगता है कि इसे -a (संग्रह) विकल्प के साथ परीक्षण करना चाहिए, आपको rsync -aशुरू में (या सीपी समकक्ष) फाइलों को "कॉपी" करना चाहिए , फिर हटा दिया गया या संशोधित करना चाहिए। (मैं rsync से चिपकना पसंद करता हूं क्योंकि मुझे पता है कि यह क्या हो रहा है, इसके बारे में सोचने के बिना यह आत्मनिर्भर है।) मुझे लगता है कि मूल आदेश के साथ काम करना चाहिए था। -A विकल्प में -t (टाइमस्टैम्प की तुलना) शामिल है, जो कि वैकल्पिक -c (चेकसम द्वारा तुलना) है।
ऋषि

2
मेरी राय में, यह उत्तर स्वीकार किया जाना चाहिए, क्योंकि यह कहीं अधिक सरल है। इसके अलावा, कमांड ने केवल मेरे लिए काम किया जब मैंने इसके लिए पूर्ण पथ प्रदान किया old/और new/
यमनको

ऐसा लगता है कि तुलना-भाग्य अंतर के सापेक्ष पथ होना चाहिए जैसा कि वास्तविक भाग्य के अंदर से देखा गया है
रयान विलियम्स

1

यह कुछ पाठकों की मदद कर सकता है: विंडोज में, एक पुराना, थोड़ा फ्रीवेयर प्रोग्राम - थर्ड डर - ठीक वही करता है जो यहां मांगा जा रहा है। यह अब डेवलपर के माध्यम से उपलब्ध नहीं है, रॉबर्ट Vašíek। लेकिन मुझे यकीन है कि इसे ऑनलाइन कुछ रिपॉजिटरी के जरिए पाया जा सकता है।

यहाँ डेवलपर का विवरण है, जो उसकी साइट पर रहता है:

तीसरा डिर: एक असामान्य निर्देशिका-सिंक्रोनाइज़र - अलग-अलग फ़ाइलों को तीसरी निर्देशिका में कॉपी किया जाता है। फ़िक्स्ड डिस्क पर एक विशाल निर्देशिका ट्री से उदाहरण के लिए नई या संपादित फ़ोटो को अस्थायी फ़ोल्डर में निकालना बहुत उपयोगी है, फिर उन्हें संग्रह सीडी में जोड़ें (ध्यान दें - मूल फ़ाइलों की तुलना सीडी के खिलाफ की जाती है)। संस्करण 1.4, आकार 23kB। 2005-02-12 को बनाया गया।

इतिहास: संस्करण 1.14 - अधिक कुशल जब हजारों फ़ाइलों में से दस की तुलना की जाती है।


0

Yamaneko परिवर्धन के साथ ठाणे द्वारा दिया गया rsync तरीका शानदार काम करता है लेकिन खाली निर्देशिकाओं को छोड़ देता है। मेरे लिए अंतिम समाधान दो चरणों में था, पहले पूर्ण पथ के साथ rsync को कॉल करें, फिर सभी खाली निर्देशिकाओं को निकालने का कमांड खोजें:

rsync -rvcm --compare-dest=/tmp/org/ /tmp/new/ /tmp/difference/
find /tmp/difference/ -d -type d -empty -exec rmdir {} \; -print

कृपया ध्यान दें कि --links विकल्प के साथ भी, rsync ने प्रतीकात्मक लिंक नहीं रखे लेकिन गंतव्य डेटा को कॉपी किया।


ध्यान दें कि इसके बजाय -empty -exec rmdir {} \;आप उपयोग कर सकते हैं -empty -delete
मिवक

-3

मैं ड्यूलपेन एक्सवाई एक्सप्लोरर (कमर्शियल) का उपयोग करता हूं, जो बहुत सारी ट्रिक्स कर सकता है और यह उनमें से एक है। Currentएक फलक में खुला और दूसरे में पुराना। वर्तमान फलक को सक्रिय करें। पर जाएं फलक > सिंक का चयन करें। यह आपको चयन करने के लिए 5 विकल्प देता है:

  1. मिलान (दोनों में सूचीबद्ध)
  2. Uniques (सक्रिय फलक में)
  3. नया (सक्रिय फलक में)
  4. अद्वितीय और नई फ़ाइलें (सक्रिय फलक में)
  5. चयनित (दूसरे फलक में चयनित)

अब आप परिणामी चयन Currentको उस जगह से कॉपी कर सकते हैं जहाँ से आप चाहते हैं। मैंने इसका उपयोग mailfoldersनवीनतम के साथ पुराने इंस्टॉल से तुलना करने के लिए किया। फ़ोल्डर संरचना काफी जटिल थी, लेकिन (लगभग) सभी mbs-filesमें एक अद्वितीय संख्या थी।

इसलिए मैंने mbs-filesपुराने रूट mailfolder(एक फलक में) के साथ-साथ सबसे नए (दूसरे फलक में) पर खोज की और प्रत्येक फलक में खोज परिणामों पर एक तुलना की ( सिंक सेलेक्ट यूनिक , मेल्स खोजने के लिए जो दौरान गायब हो गया पुनः इंस्टॉल)! आप बहुत सारे विकल्प भी सेट कर सकते हैं।


1
यदि आप गैर मानक सॉफ्टवेयर के बारे में बात कर रहे हैं, तो आपको एक लिंक शामिल करना चाहिए। अगर आपका मतलब XYplorer से है, जो ओपी की मदद करने वाला नहीं है।
एंथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.