উত্তর:
ডিএসইএনসি, ডিফল্টরূপে কেবলমাত্র ফাইলের মেটাডেটা তুলনা করে।
rsync -n -a -i --delete source/ target/
ব্যাখ্যা:
-n
আসলে কপি বা মুছবেন না <- এটি গুরুত্বপূর্ণ! 1-a
টাইমস্ট্যাম্প এবং বৈশিষ্ট্যগুলির মতো ফাইলের সমস্ত মেটাডেটা তুলনা করুন-i
প্রতি ফাইল তথ্য এক লাইন মুদ্রণ--delete
উত্স নয় এমন ফাইলগুলিও প্রতিবেদন করুনদ্রষ্টব্য: স্ল্যাশ সহ ডিরেক্টরিটির নাম যুক্ত করা গুরুত্বপূর্ণ is এটি একটি আরএসআইএনসি জিনিস।
আপনি যদি একই ফাইলগুলির জন্য মুদ্রিত লাইনগুলি দেখতে চান তবে -i
দুবার সরবরাহ করুন
rsync -n -a -ii --delete source/ target/
উদাহরণ আউটপুট:
*deleting removedfile (file in target but not in source)
.d..t...... ./ (directory with different timestamp)
>f.st...... modifiedfile (file with different size and timestamp)
>f+++++++++ newfile (file in source but not in target)
.f samefile (file that has same metadata. only with -ii)
মনে রাখবেন যে rsync কেবল মেটাডেটার সাথে তুলনা করে। এর অর্থ যদি ফাইলের সামগ্রী পরিবর্তন হয় তবে মেটাডেটা একই থাকে তবে আরএসসিএনসি ফাইলটি একই বলে প্রতিবেদন করবে। এটি একটি সম্ভাবনাময় দৃশ্য। সুতরাং হয় বিশ্বাস করুন যে যখন মেটাডেটা একই হয় তখন ডেটা একই হয়, বা আপনাকে ফাইলের ডেটাটি কিছুক্ষণের সাথে তুলনা করতে হবে।
বোনাস: অগ্রগতির তথ্যের জন্য এখানে দেখুন: আরএসসিএনসি শেষ করার জন্য আনুমানিক সময় বা কাজ বাকি আছে?
*deleting
তবে উত্সগুলিতে থাকা ফাইলগুলি কেবল প্রদর্শিত হয়নি। স্ল্যাশগুলি দুর্ঘটনাক্রমে ভুলে যাওয়া সহজ এবং তারপরে আপনি একটি প্রশংসনীয় তবে ভুল আউটপুট পান।
ব্যবহার করুন -q
( --brief
সঙ্গে) বিকল্প diff -r
( diff -qr
)। info
জিএনইউ এর জন্য পৃষ্ঠা থেকে diff
:
1.6 সংক্ষিপ্তকরণে কোন ফাইলগুলি পৃথক হয়
যখন আপনি কেবল ফাইলগুলি পৃথক কিনা তা সন্ধান করতে চান এবং পার্থক্য কী তা আপনার যত্ন নেই, আপনি সংক্ষিপ্ত আউটপুট ফর্ম্যাটটি ব্যবহার করতে পারেন। এই বিন্যাসে, ফাইলগুলির মধ্যে পার্থক্য দেখানোর পরিবর্তে
diff' simply reports whether files differ. The
--b ব্রিফ '(q -Q') বিকল্পটি এই আউটপুট ফর্ম্যাটটি নির্বাচন করে।দুটি ডিরেক্টরি সামগ্রীর সাথে তুলনা করার সময় এই ফর্ম্যাটটি বিশেষত কার্যকর especially লাইন তুলনা করে এটি সাধারণ লাইনটি করার চেয়েও দ্রুত, কারণ 'ডিফ' ফাইলগুলি বিশ্লেষণ করা বন্ধ করতে পারে যত তাড়াতাড়িই জানা যায় যে কোনও পার্থক্য রয়েছে।
এটি লাইন দ্বারা রেখার সাথে তুলনা করবে না, বরং সম্পূর্ণরূপে ফাইলটি, যা প্রসেসরের ব্যাপক গতি বাড়ায় (কী 'আপনি যা খুঁজছেন)।
এখানে একটি অজগর স্ক্রিপ্ট রয়েছে যা পরীক্ষা করবে যে ফাইলের নামগুলি, মাইটাইমগুলি এবং ফাইলের আকারগুলি একই রকম:
import os
import sys
def getStats(path):
for pathname, dirnames, filenames in os.walk(path):
for filename in ( os.path.join(pathname, x) for x in filenames ):
stat = os.stat(filename)
yield filename[len(path):], stat.st_mtime, stat.st_size
sys.exit(tuple(getStats(sys.argv[1])) != tuple(getStats(sys.argv[2])))
আপনার যদি কেবল দুটি ফাইল সিস্টেম শাখার ফাইলগুলি পৃথক কিনা (ফাইলগুলির অভ্যন্তরীণ দিকে তাকান না) জানতে প্রয়োজন তবে আপনি এই জাতীয় কিছু করতে পারেন:
find /opt/branch1 -type f | sort | xargs -i md5sum {} >/tmp/branch1;
find /opt/branch2 -type f | sort | xargs -i md5sum {} >/tmp/branch2;
diff /tmp/branch1 /tmp/branch2;
আছে HTH
ক্রিস ডাউনের স্ক্রিপ্টের ভিত্তিতে এই স্ক্রিপ্টটি আরও কিছুটা "ভিজ্যুয়াল"। এটি দুটি আর্গুমেন্ট সহ কল করে folder1
এবং folder2
এটি প্রথম ফোল্ডারটি নিয়ে যায় এবং প্রতিটি ফাইলের জন্য দ্বিতীয় ফোল্ডারে একটি সম্পর্কিত ফাইল সন্ধান করে। যদি এটি পাওয়া যায় তবে আপেক্ষিক পাথ সবুজ রঙে মুদ্রিত হয়, যদি তাদের পরিবর্তিত সময় বা আকারের আলাদা আলাদা থাকে তবে এটি হলুদ রঙে মুদ্রিত হয় এবং যদি এটি না পাওয়া যায় তবে এটি লাল রঙে মুদ্রিত হয়।
#!/usr/bin/env python
import os
import sys
from termcolor import colored
def compare_filestats(file1,file2):
"""
Compares modified time and size between two files.
Return:
-1 if file1 or file2 does not exist
0 if they exist and compare equal
1 if they have different modified time, but same size
2 if they have different size, but same modified time
3 if they have different size, and different modified time
"""
if not os.path.exists(file1) or not os.path.exists(file2):
return -1
stat1 = os.stat(file1)
stat2 = os.stat(file2)
return (stat1.st_mtime != stat2.st_mtime) \
+ 2*(stat1.st_size != stat2.st_size)
def compare_folders(folder1,folder2):
"""
folder1: serves as reference and will be walked through
folder2: serves as target and will be querried for each file in folder1
Prints colored status for each file in folder1:
missing: file was not found in folder2
mtime : modified time is different
size : filesize is different
ok : found with same filestats
"""
for dirpath, dirnames, filenames in os.walk(folder1):
for file1 in ( os.path.join(dirpath, x) for x in filenames ):
relpath = file1[len(folder1):]
file2 = os.path.join( folder2, relpath )
comp = compare_filestats(file1,file2)
if comp < 0:
status = colored('[missing]','red')
elif comp == 1:
status = colored('[mtime ]','yellow')
elif comp >= 2:
status = colored('[size ]','yellow')
else:
status = colored('[ok ]','green')
print status, relpath
if __name__ == '__main__':
compare_folders(sys.argv[1],sys.argv[2])
মনে রাখবেন যে দুটি ফোল্ডার সমান কিনা তা নির্ধারণের জন্য এটি পর্যাপ্ত নয় , আপনার এটি নিশ্চিত করার জন্য উভয় দিক দিয়ে চালানো দরকার। অনুশীলনে আপনি যদি কেবল ফোল্ডারগুলি একই কিনা তা জানতে চান , তবে ক্রিসের স্ক্রিপ্ট আরও ভাল। আপনি যদি জানতে চান যে কী অনুপস্থিত বা এক ফোল্ডার থেকে অন্য ফোল্ডারে আলাদা , তবে আমার স্ক্রিপ্ট আপনাকে জানাবে।
উল্লেখ্য: আপনি, ইনস্টল termcolor প্রয়োজন হবে pip install termcolor
।
আপনি যদি কেবল একটি কাঠামো এবং ফাইলগুলি সম্পর্কে কিছু প্রাথমিক তথ্য তুলনা করতে চান তবে আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:
diff <(cd $DIR1 && ls -laR) <(cd $DIR2 && ls -laR)
আমি এটি পরীক্ষা করিনি, সুতরাং কোনও সম্পাদনা স্বাগত :)
<()
নিজস্ব পরিবেশ রয়েছে সেটির সুবিধা নিন । সম্পাদনা করা হয়েছে।
source/
এবংtarget/
এছাড়াও উভয় খুবই গুরুত্বপূর্ণ! (এগুলি ব্যতীত, আপনি উত্স এবং টার্গেট ডিরেক্টরি নামের সাথে শিশু ফাইলের নামের সাথে তুলনা করতে পারেন, তাই সমস্ত ফাইলের নাম পৃথক হবে))