আপনি কীভাবে দুটি ফোল্ডার তুলনা করতে এবং তৃতীয় ফোল্ডারে পার্থক্যটি অনুলিপি করবেন?


23

আপনি তিনটি ফোল্ডার পেয়েছেন:

  • ফোল্ডার কারেন্ট , এতে আপনার বর্তমান ফাইল রয়েছে
  • পুরাতন ফোল্ডার , যা একই ফাইলগুলির একটি পুরানো সংস্করণ রয়েছে
  • ফোল্ডার পার্থক্য , যা কেবল একটি খালি ফোল্ডার

আপনি কিভাবে তুলনা না পুরাতন সঙ্গে বর্তমান এবং ফাইল যা পৃথক (বা সম্পূর্ণরূপে নতুন) হয় কপি বর্তমান থেকে পার্থক্য ?


আমি চারপাশে অনুসন্ধান করেছি এবং এটি মোকাবেলা করা সহজ জিনিস বলে মনে হচ্ছে, তবে আমি এটি আমার বিশেষ উদাহরণে কাজ করতে পারি না। বেশিরভাগ উত্স আরএসসিএনসি ব্যবহারের পরামর্শ দিয়েছিল তাই আমি নিম্নলিখিত কমান্ডটি দিয়ে শেষ করেছি:

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

এটি যা করে তা হ'ল নতুন থেকে আলাদা করে সমস্ত ফাইল অনুলিপি করা , এমনকি পুরানো ফাইলগুলির মতো ।

যদি এটি সাহায্য করে (সম্ভবত আদেশটি ঠিক আছে এবং ত্রুটি অন্য কোথাও রয়েছে), আমি এটি এইভাবে পরীক্ষা করেছি:

  1. আমি তিনটি ফোল্ডার তৈরি।
  2. আমি পুরানো বিভিন্ন বিষয়বস্তু সহ বেশ কয়েকটি পাঠ্য ফাইল তৈরি করেছি ।
  3. আমি পুরানো থেকে নতুন ফাইলগুলি অনুলিপি করেছি ।
  4. আমি নতুন কিছু ফাইলের সামগ্রী পরিবর্তন করেছি এবং কয়েকটি অতিরিক্ত ফাইল যুক্ত করেছি।
  5. আমি উপরের কমান্ডটি চালিয়েছি এবং ফলাফলগুলি পৃথকভাবে দেখেছি ।

আমি গত কয়েক দিন ধরে একটি সমাধান খুঁজছিলাম এবং আমি সত্যিই কিছু সাহায্যের প্রশংসা করব। অগত্যা এটি আরএসসিএন ব্যবহার করা উচিত নয়, তবে আমি যদি সম্ভব হয় তবে আমি কী ভুল করছি তা জানতে চাই।



@ উইনজেডসবারমারিনার আমি মনে করি না যে এটি একটি সদৃশ, লিঙ্কিত প্রশ্নের গৃহীত উত্তর হিসাবে, ওপি একটি প্রশ্ন জিজ্ঞাসা করছে?
বার্নহার্ড

@ বার্নহার্ড আহ, আমার খারাপ। আমার ধারণা আমি মূল প্রশ্নটি ভুল বুঝেছি।
উইজেডসবারমারিনার

@ উইঞ্জডসুবারিনার কোনও উদ্বেগ নেই, আপনি বলেছিলেন "সম্ভব", এবং আমি সম্মত হলাম এটি দেখতে অনেকটা অনুরূপ :)
বার্নহার্ড

উত্তর:


7

আপনি কোনও বিদ্যমান লিনাক্স কমান্ড যেমন আরএসসিএনএফ বা ডিফ দিয়ে এটি করতে পারবেন কিনা তা নিশ্চিত নই I তবে আমার ক্ষেত্রে পাইথনটি ব্যবহার করে আমার নিজের স্ক্রিপ্টটি লিখতে হয়েছিল, কারণ ফাইল তুলনা করার জন্য পাইথনের "ফাইলসিএমপি" মডিউল রয়েছে। আমি সম্পূর্ণ স্ক্রিপ্ট এবং ব্যবহারটি আমার ব্যক্তিগত সাইটে পোস্ট করেছি - 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প্রথমে ফাইলগুলি "অনুলিপি" করা (বা সিপি সমতুল্য) হওয়া উচিত ছিল, তারপরে মুছে ফেলা বা সংশোধন করা উচিত। (আমি আরএসআইএনসি-তে আটকে থাকতে পছন্দ করি কারণ আমি জানি এটি কী করছে তা ভেবেই এটি স্বনির্ভর।) আমি মনে করি এটি আসল কমান্ডের সাথে কাজ করা উচিত ছিল। -A বিকল্পটিতে অন্তর্ভুক্ত রয়েছে -t (টাইমস্ট্যাম্পের সাথে তুলনা), যা -c এর বিকল্প (চেকসাম দ্বারা তুলনা করুন)।
ঋষি

2
আমার মতে, এই উত্তরটি গ্রহণযোগ্য হওয়া উচিত, কারণ এটি আরও সহজ। এছাড়াও, কমান্ডটি কেবল তখনই আমার পক্ষে কাজ করেছিল যখন আমি old/এবং এর জন্য সম্পূর্ণ পথ সরবরাহ করি new/
ইয়ামেনেকো

এই সতর্কতাই মনে হয় যে তুলনা-গন্তব্যটি অবশ্যই বাস্তব গন্তব্যের অভ্যন্তরীণ দিক থেকে পাওয়া পার্থক্যের জন্য আপেক্ষিক পথ হতে পারে
রায়ান উইলিয়ামস

1

এটি কিছু পাঠকদের সহায়তা করতে পারে: উইন্ডোজে, একটি পুরানো, ছোট্ট ফ্রিওয়্যার প্রোগ্রাম - তৃতীয় দির - এখানে যা চাওয়া হচ্ছে ঠিক তা করে। এটি বিকাশকারী, রবার্ট ভয়েকের মাধ্যমে আর উপলব্ধ নেই। তবে আমি নিশ্চিত যে এটি অনলাইনে কয়েকটি সংগ্রহস্থলের মাধ্যমে পাওয়া যাবে।

এখানে বিকাশকারীর বিবরণ দেওয়া আছে, যা তার সাইটে থেকে যায়:

তৃতীয় দির: একটি অস্বাভাবিক ডিরেক্টরি-সিঙ্ক্রোনাইজার - বিভিন্ন ফাইল তৃতীয় ডিরেক্টরিতে অনুলিপি করা হয়। স্থায়ী ডিস্কের বিশাল ডিরেক্টরি গাছ থেকে অস্থায়ী ফোল্ডারে নতুন বা সম্পাদিত ছবিগুলি বের করা খুব দরকারী, তারপরে সেগুলি সংরক্ষণাগার সিডিতে যুক্ত করুন (নোট - মূল ফাইলগুলি সিডির সাথে তুলনা করা হয়)। সংস্করণ 1.4, আকার 23 কেবি। 2005-02-12 তৈরি হয়েছিল।

ইতিহাস: সংস্করণ 1.14 - যখন কয়েক হাজার ফাইলের তুলনা করা হয় তখন আরও কার্যকর।


0

ইয়ামেনেকো সংযোজনগুলির সাথে থানায় দেওয়া আরএসএনসি উপায় দুর্দান্ত কাজ করে তবে খালি ডিরেক্টরি ছেড়ে যায়। আমার জন্য চূড়ান্ত সমাধানটি দুটি পদক্ষেপে ছিল, প্রথমে পুরো পাথ দিয়ে আরএসসিএনসি কল করুন, তারপরে সমস্ত খালি ডিরেক্টরি মুছে ফেলার জন্য একটি আদেশ সন্ধান করুন:

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

দয়া করে মনে রাখবেন - লিঙ্ক বিকল্পের চেয়েও, rsync প্রতীকী লিঙ্কগুলি রাখেনি তবে পরিবর্তে গন্তব্য ডেটা অনুলিপি করেছে।


-empty -exec rmdir {} \;আপনি পরিবর্তে ব্যবহার করতে পারেন তা নোট করুন -empty -delete
mivk

-3

আমি ডুয়েলপেন এক্সওয়াই এক্সপ্লোরার (বাণিজ্যিক) ব্যবহার করি যা প্রচুর কৌশল করতে পারে এবং এটি এর মধ্যে একটি। খোলাCurrentএকটি ফলকে এবং অন্যটিতে ওল্ড । বর্তমান ফলকটি সক্রিয় করুন। যান ফলকগুলির > সিঙ্ক নির্বাচন করুন। এটি আপনাকে নির্বাচন করার জন্য 5 টি বিকল্প দেয়:

  1. ম্যাচ (উভয় তালিকাভুক্ত)
  2. কৌশলগুলি (সক্রিয় ফলকে)
  3. নতুন (সক্রিয় ফলকে)
  4. স্বতন্ত্র এবং নবীনতর ফাইল (সক্রিয় ফলকে)
  5. নির্বাচিত (অন্য ফলকে নির্বাচিত)

এখন আপনি ফলাফলটি Currentযেখানে চান তা অনুলিপি করতে পারেন। আমি এটি mailfoldersসর্বশেষতমের সাথে পুরানো ইনস্টলগুলি থেকে তুলনা করতে ব্যবহার করেছি । ফোল্ডার কাঠামো বেশ জটিল ছিল, তবে (প্রায়) সমস্তmbs-files একটি স্বতন্ত্র সংখ্যা ছিল।

সুতরাং আমি mbs-filesপুরানো মূলটিতে mailfolder(একটি ফলকে) পাশাপাশি সর্বাধিক নতুন (অন্য ফলকে) অনুসন্ধান করেছি এবং প্রতিটি ফলকের অনুসন্ধান ফলাফলের সাথে তুলনা করেছি ( সিঙ্ক সিলেক্ট ইউনিক , মেলগুলি খুঁজে পাওয়া যায় নি যা খুঁজে পেয়েছে) পুনরায় ইনস্টলেশনের)! আপনি অনেক অপশন সেট করতে পারেন।


1
আপনি যদি মানহীন সফ্টওয়্যার সম্পর্কে কথা বলছেন তবে আপনার একটি লিঙ্ক অন্তর্ভুক্ত করা উচিত। যদি আপনি XYplorer বলতে চান তবে এটি ওপিতে একেবারেই সহায়তা করবে না।
অ্যান্থন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.