rsync: ফোল্ডারগুলি সিঙ্ক করুন তবে অতিরিক্ত ফাইলগুলি লক্ষ্যবস্তু রাখুন


10

আমি শুরু করছি rsyncএবং স্থানীয় সিস্টেমে দুটি ফোল্ডার সিঙ্ক করার জন্য এটি ব্যবহার করার চেষ্টা করেছি। আমার একটি উত্স ফোল্ডার রয়েছে, যার বিষয়বস্তু সময়ের সাথে সাথে পরিবর্তন হয় (কিছু ফাইল যুক্ত হয়, কিছু পরিবর্তন ঘটে এবং কিছু মুছে ফেলা হয়) এবং একটি লক্ষ্য ফোল্ডার যা আমি প্রায় উত্সের আয়না হতে চাই want সুতরাং আমি যা চেষ্টা করেছি তা এইভাবে আরএসসিএন ব্যবহার করছিল:

rsync -a --delete "${source_dir}" "${target_dir}";

এটি টার্গেটের বিষয়বস্তু উত্সের সামগ্রী হিসাবে ঠিক একই রাখে। যাইহোক, আমি উত্স নয়, লক্ষ্য হিসাবে কিছু ফাইল যুক্ত করতে সক্ষম হতে চাই, তবে আমি চাই না যে প্রতিবার আমি আরএসসিএনসি করি সেগুলি সেগুলি মুছে ফেলা হবে। অন্যদিকে, যে ফাইলগুলি সিঙ্ক করা হত এবং তারপরে উত্সে মুছে ফেলা হত সেগুলি এখনও মুছে ফেলা উচিত।

আমি বাদ দিতে চাই এমন প্রতিটি ফাইলের জন্য কমান্ডটি পরিবর্তন না করে এটি করার কোনও উপায় আছে কি?

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


হাই @ আসজুনেস হার্ট, কেবল কৌতূহলী, তবে আপনি কি উত্তর (গুলি) পরীক্ষা করেছেন?
জ্যাকব Vlijm

আপনি কি --delet বিকল্পটি ব্যবহার করার চেষ্টা করেছেন? এটি হ'ল রোবকপির মধ্যে / এমআইআর বিকল্পের মতো।
এসডসোলার

উত্তর:


9

rsyncঅপশন নামক একটি বিকল্প রয়েছে --exclude-fromযা আপনাকে বাদ দিতে চাইলে যে কোনও ফাইলের তালিকা সহ একটি ফাইল তৈরি করতে দেয়। আপনি যখনই নতুন বর্জন যুক্ত করতে চান বা কোনও পুরানোটি মুছতে চান আপনি এই ফাইলটি আপডেট করতে পারেন।

আপনি যদি /home/user/rsync_excludeনতুন কমান্ডে বর্জনকারী ফাইল তৈরি করেন তবে তা হ'ল :

rsync -a --delete --exclude-from="/home/user/rsync_exclude" "${source_dir}" "${target_dir}"

বর্জন তালিকা ফাইল তৈরি করার সময়, আপনার প্রতিটি বর্জনীয় নিয়ম একটি পৃথক লাইনে রাখা উচিত। ব্যতিক্রমগুলি আপনার উত্স ডিরেক্টরি সম্পর্কিত। যদি আপনার /home/user/rsync_excludeফাইলটিতে নিম্নলিখিত বিকল্পগুলি থাকে:

secret_file
first_dir/subdir/*
second_dir/common_name.*
  • secret_fileআপনার উত্স ডিরেক্টরিতে ডাকা যে কোনও ফাইল বা ডিরেক্টরি বাদ দেওয়া হবে।
  • যে কোনও ফাইল ${source_dir}/first_dir/subdirবাদ দেওয়া হবে, তবে একটি খালি সংস্করণ subdirসিঙ্ক হবে।
  • ${source_dir}/second_dirপ্রিফিক্স সহ যে কোনও ফাইল common_name.এড়ানো হবে। সুতরাং common_name.txt, common_name.jpgইত্যাদি

আমি নিশ্চিত নই যে এটি আমার যা ইচ্ছা তা করে কিনা। এছাড়াও লক্ষ্য হিসাবে যুক্ত হওয়া প্রতিটি ফাইল বা ফোল্ডারটি তালিকাভুক্ত করা আমি অবৈধ মনে করি। আমি বরং এটি করার একটি স্বয়ংক্রিয় উপায় চাই। আসুন ধরা যাক আমার লক্ষ্যবস্তুতে বিভিন্ন স্ক্রিপ্ট রয়েছে যা একাধিক লগ-ফাইল তৈরি করে (লক্ষ্যবস্তুতেও) এবং আমি এই ফাইলগুলির প্রতিটি অবস্থান আরএসসিএনসি_এক্সক্লুড-ফাইলে তালিকাবদ্ধ করতে চাই না। আরএসইএনসি "স্মরণ" করার কোন উপায় আছে যা কোন ফাইলগুলিতে সিঙ্ক হয়েছে এবং কেবল সেগুলি --delet দ্বারা প্রভাবিত হতে দেয়?
jkrzefski

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

@jkrzefski আপনি যদি অন্য কোনও স্ক্রিপ্ট থেকে টার্গেটে ফাইল তৈরি করছেন এবং সেগুলি উত্স থেকে বাদ দিতে চান তবে কেন সেই লগ ফাইলগুলির গন্তব্য অন্য ফোল্ডারে পরিবর্তন করবেন না? সম্ভবত আপনি যদি এগুলি সিঙ্ক না করে থাকেন তবে তা কম গুরুত্বপূর্ণ হওয়ায়।

6

যেহেতু আপনি উল্লেখ করেছেন: আমি আরএসআইএনসি-তে সীমাবদ্ধ নই:

লক্ষ্যতে অতিরিক্ত ফাইল যুক্ত করার অনুমতি দিয়ে আয়না বজায় রাখতে স্ক্রিপ্ট

একটি স্ক্রিপ্টের নীচে যা আপনি বর্ণনা করেছেন ঠিক তা করে।

স্ক্রিপ্টটি ভার্বোজ মোডে চালানো যেতে পারে (স্ক্রিপ্টে সেট করার জন্য), যা ব্যাকআপ (মিররিং) এর অগ্রগতি আউটপুট করবে। এটি বলার দরকার নেই ব্যাকআপগুলি লগ করতেও এটি ব্যবহার করা যেতে পারে:

ভার্বোজ বিকল্প

এখানে চিত্র বর্ণনা লিখুন


ধারণাটি

1. প্রথম ব্যাকআপে, স্ক্রিপ্ট:

  • একটি ফাইল তৈরি করে (লক্ষ্য ডিরেক্টরিতে), যেখানে সমস্ত ফাইল এবং ডিরেক্টরি তালিকাভুক্ত থাকে; .recentfiles
  • লক্ষ্য ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরিগুলির একটি সঠিক অনুলিপি (আয়না) তৈরি করে

২. পরবর্তী এবং ঠিক তে

  • স্ক্রিপ্টটি ফাইলগুলির ডিরেক্টরি কাঠামো এবং পরিবর্তনের তারিখ (গুলি) এর সাথে তুলনা করে। উত্সে থাকা নতুন ফাইল এবং ডায়ারগুলি আয়নাতে অনুলিপি করা হয়েছে। একই সময়ে একটি দ্বিতীয় (অস্থায়ী) ফাইল তৈরি করা হয়, উত্স ডিরেক্টরিতে বর্তমান ফাইল এবং ডায়ার তালিকাভুক্ত করা হয়; .currentfiles
  • পরবর্তী সময়ে, .recentfiles(পূর্ববর্তী ব্যাকআপের উপরে অবস্থার তালিকা করা) তুলনা করা হয় .currentfilesকেবলমাত্র ফাইলগুলি .recentfilesযা থেকে নেই .currentfilesসেগুলি অবশ্যই উত্স থেকে সরানো হবে এবং লক্ষ্য থেকে সরানো হবে।
  • টার্গেট ফোল্ডারে আপনি ম্যানুয়ালি যুক্ত ফাইলগুলি স্ক্রিপ্টের দ্বারা কোনওভাবেই "দেখা" হয় না এবং একা থাকে left
  • শেষ অবধি, সাময়িকভাবে পরবর্তী ব্যাকআপ চক্রটি পরিবেশন করতে .currentfilesনামকরণ করা .recentfilesহয়েছে।

এই পান্ডুলিপি

#!/usr/bin/env python3
import os
import sys
import shutil

dr1 = sys.argv[1]; dr2 = sys.argv[2]

# --- choose verbose (or not)
verbose = True
# ---

recentfiles = os.path.join(dr2, ".recentfiles")
currentfiles = os.path.join(dr2, ".currentfiles")

if verbose:
    print("Counting items in source...")
    file_count = sum([len(files)+len(d) for r, d, files in os.walk(dr1)])
    print(file_count, "items in source")
    print("Reading directory & file structure...")
    done = 0; chunk = int(file_count/5); full = chunk*5

def show_percentage(done):
    if done % chunk == 0:
        print(str(int(done/full*100))+"%...", end = " ")

for root, dirs, files in os.walk(dr1):
    for dr in dirs:
        if verbose:
            if done == 0:
                print("Updating mirror...")
            done = done + 1
            show_percentage(done) 
        target = os.path.join(root, dr).replace(dr1, dr2)
        source = os.path.join(root, dr)
        open(currentfiles, "a+").write(target+"\n")
        if not os.path.exists(target):
            shutil.copytree(source, target)
    for f in files:
        if verbose:
            done = done + 1
            show_percentage(done)
        target = os.path.join(root, f).replace(dr1, dr2)
        source = os.path.join(root, f)
        open(currentfiles, "a+").write(target+"\n") 
        sourcedit = os.path.getmtime(source)
        try:
            if os.path.getmtime(source) > os.path.getmtime(target):
                shutil.copy(source, target)   
        except FileNotFoundError:
            shutil.copy(source, target)

if verbose:
    print("\nChecking for deleted files in source...")

if os.path.exists(recentfiles):
    recent = [f.strip() for f in open(recentfiles).readlines()]
    current = [f.strip() for f in open(currentfiles).readlines()]
    remove = set([f for f in recent if not f in current])
    for f in remove:
        try:
            os.remove(f)
        except IsADirectoryError:
            shutil.rmtree(f)
        except FileNotFoundError:     
            pass
        if verbose:
            print("Removed:", f.split("/")[-1])

if verbose:
    print("Done.")

shutil.move(currentfiles, recentfiles)

ব্যবহারবিধি

  1. একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন backup_special.py
  2. আপনি যদি চান- পরিবর্তন করুন - স্ক্রিপ্টের শিরোনামে Verbose বিকল্প:

    # --- choose verbose (or not)
    verbose = True
    # ---
    
  3. এটি উত্স এবং আর্গুমেন্ট হিসাবে লক্ষ্য নিয়ে চালান:

     python3 /path/to/backup_special.py <source_directory> <target_directory>
    

দ্রুততা

আমি আমার জিপি-র ড্রাইভের (এনএএস) কিছু 40.000 ফাইল এবং ডায়ার দিয়ে 10 জিবি ডিরেক্টরিতে স্ক্রিপ্টটি পরীক্ষা করেছি, এটি ব্যাকআপটিকে একই সাথে আরএসইএনসি হিসাবে তৈরি করেছে।

পুরো ডিরেক্টরিটি আপডেট করা আরএসসিএনসি থেকে 40.000 ফাইলের চেয়ে কয়েক সেকেন্ড বেশি সময় নিয়েছিল যা ইমো গ্রহণযোগ্য এবং কোনও আশ্চর্যের কিছু নয়, যেহেতু স্ক্রিপ্টটিকে শেষের তৈরি ব্যাকআপের সাথে সামগ্রীর তুলনা করতে হবে।


হাই @ আসজুনের হার্ট একটি স্ক্রিপ্টযুক্ত বিকল্প যুক্ত করেছে। সব পরিষ্কার থাকলে দয়া করে উল্লেখ করুন।
জ্যাকব Vlijm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.