যেহেতু আপনি উল্লেখ করেছেন: আমি আরএসআইএনসি-তে সীমাবদ্ধ নই:
লক্ষ্যতে অতিরিক্ত ফাইল যুক্ত করার অনুমতি দিয়ে আয়না বজায় রাখতে স্ক্রিপ্ট
একটি স্ক্রিপ্টের নীচে যা আপনি বর্ণনা করেছেন ঠিক তা করে।
স্ক্রিপ্টটি ভার্বোজ মোডে চালানো যেতে পারে (স্ক্রিপ্টে সেট করার জন্য), যা ব্যাকআপ (মিররিং) এর অগ্রগতি আউটপুট করবে। এটি বলার দরকার নেই ব্যাকআপগুলি লগ করতেও এটি ব্যবহার করা যেতে পারে:
ভার্বোজ বিকল্প
ধারণাটি
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)
ব্যবহারবিধি
- একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন
backup_special.py
আপনি যদি চান- পরিবর্তন করুন - স্ক্রিপ্টের শিরোনামে Verbose বিকল্প:
# --- choose verbose (or not)
verbose = True
# ---
এটি উত্স এবং আর্গুমেন্ট হিসাবে লক্ষ্য নিয়ে চালান:
python3 /path/to/backup_special.py <source_directory> <target_directory>
দ্রুততা
আমি আমার জিপি-র ড্রাইভের (এনএএস) কিছু 40.000 ফাইল এবং ডায়ার দিয়ে 10 জিবি ডিরেক্টরিতে স্ক্রিপ্টটি পরীক্ষা করেছি, এটি ব্যাকআপটিকে একই সাথে আরএসইএনসি হিসাবে তৈরি করেছে।
পুরো ডিরেক্টরিটি আপডেট করা আরএসসিএনসি থেকে 40.000 ফাইলের চেয়ে কয়েক সেকেন্ড বেশি সময় নিয়েছিল যা ইমো গ্রহণযোগ্য এবং কোনও আশ্চর্যের কিছু নয়, যেহেতু স্ক্রিপ্টটিকে শেষের তৈরি ব্যাকআপের সাথে সামগ্রীর তুলনা করতে হবে।