ডিরেক্টরিগুলির সাথে তুলনা করুন তবে ফাইলগুলির বিষয়বস্তু নয়


21

ডিফআর-এর সাহায্যে আমি এই কাজটি করতে পারি, তবে এটি এত দিন নেয় কারণ ডিফ ফাইলের বিষয়বস্তু পরীক্ষা করে।

আমি এমন কিছু চাই যা নির্ধারণ করতে পারে যে দুটি ফাইল তাদের আকার, সর্বশেষ পরিবর্তিত ইত্যাদি সম্পর্কিত একই But

অন্য কোন উপায আছে কি?

উত্তর:


20

ডিএসইএনসি, ডিফল্টরূপে কেবলমাত্র ফাইলের মেটাডেটা তুলনা করে।

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 কেবল মেটাডেটার সাথে তুলনা করে। এর অর্থ যদি ফাইলের সামগ্রী পরিবর্তন হয় তবে মেটাডেটা একই থাকে তবে আরএসসিএনসি ফাইলটি একই বলে প্রতিবেদন করবে। এটি একটি সম্ভাবনাময় দৃশ্য। সুতরাং হয় বিশ্বাস করুন যে যখন মেটাডেটা একই হয় তখন ডেটা একই হয়, বা আপনাকে ফাইলের ডেটাটি কিছুক্ষণের সাথে তুলনা করতে হবে।

বোনাস: অগ্রগতির তথ্যের জন্য এখানে দেখুন: আরএসসিএনসি শেষ করার জন্য আনুমানিক সময় বা কাজ বাকি আছে?


1
মধ্যে স্ল্যাশ source/এবং target/এছাড়াও উভয় খুবই গুরুত্বপূর্ণ! (এগুলি ব্যতীত, আপনি উত্স এবং টার্গেট ডিরেক্টরি নামের সাথে শিশু ফাইলের নামের সাথে তুলনা করতে পারেন, তাই সমস্ত ফাইলের নাম পৃথক হবে))

আমি আশা করি আপনার মন্তব্যটি আগে পড়ে ফেলতাম, এটি এত গুরুত্বপূর্ণ! আমি কেবল উত্সের স্ল্যাশ বাদ দিয়েছিলাম এবং তারপরে আমি ভাবছিলাম যে লক্ষ্যবস্তুতে থাকা ফাইলগুলি কেন প্রদর্শিত হয়নি *deletingতবে উত্সগুলিতে থাকা ফাইলগুলি কেবল প্রদর্শিত হয়নি। স্ল্যাশগুলি দুর্ঘটনাক্রমে ভুলে যাওয়া সহজ এবং তারপরে আপনি একটি প্রশংসনীয় তবে ভুল আউটপুট পান।
ব্যবহারকারী 643011

3

ব্যবহার করুন -q( --briefসঙ্গে) বিকল্প diff -r( diff -qr)। infoজিএনইউ এর জন্য পৃষ্ঠা থেকে diff:

1.6 সংক্ষিপ্তকরণে কোন ফাইলগুলি পৃথক হয়

যখন আপনি কেবল ফাইলগুলি পৃথক কিনা তা সন্ধান করতে চান এবং পার্থক্য কী তা আপনার যত্ন নেই, আপনি সংক্ষিপ্ত আউটপুট ফর্ম্যাটটি ব্যবহার করতে পারেন। এই বিন্যাসে, ফাইলগুলির মধ্যে পার্থক্য দেখানোর পরিবর্তে diff' simply reports whether files differ. The--b ব্রিফ '(q -Q') বিকল্পটি এই আউটপুট ফর্ম্যাটটি নির্বাচন করে।

দুটি ডিরেক্টরি সামগ্রীর সাথে তুলনা করার সময় এই ফর্ম্যাটটি বিশেষত কার্যকর especially লাইন তুলনা করে এটি সাধারণ লাইনটি করার চেয়েও দ্রুত, কারণ 'ডিফ' ফাইলগুলি বিশ্লেষণ করা বন্ধ করতে পারে যত তাড়াতাড়িই জানা যায় যে কোনও পার্থক্য রয়েছে।

এটি লাইন দ্বারা রেখার সাথে তুলনা করবে না, বরং সম্পূর্ণরূপে ফাইলটি, যা প্রসেসরের ব্যাপক গতি বাড়ায় (কী 'আপনি যা খুঁজছেন)।


1
- q এর সমস্যাটি হ'ল এটি সাধারণ তুলনা করে এবং যখন কোনও পার্থক্য থামে (যখন সাধারণ মোডটি এটি তুলনা করতে থাকে), তাই যদি বিশাল ফাইলগুলি একই হয় তবে এটি অনেক বেশি স্থায়ী হয়।
eez0

2

এখানে একটি অজগর স্ক্রিপ্ট রয়েছে যা পরীক্ষা করবে যে ফাইলের নামগুলি, মাইটাইমগুলি এবং ফাইলের আকারগুলি একই রকম:

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])))

1

আপনার যদি কেবল দুটি ফাইল সিস্টেম শাখার ফাইলগুলি পৃথক কিনা (ফাইলগুলির অভ্যন্তরীণ দিকে তাকান না) জানতে প্রয়োজন তবে আপনি এই জাতীয় কিছু করতে পারেন:

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


0

ক্রিস ডাউনের স্ক্রিপ্টের ভিত্তিতে এই স্ক্রিপ্টটি আরও কিছুটা "ভিজ্যুয়াল"। এটি দুটি আর্গুমেন্ট সহ কল ​​করে 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


0

আপনি যদি কেবল একটি কাঠামো এবং ফাইলগুলি সম্পর্কে কিছু প্রাথমিক তথ্য তুলনা করতে চান তবে আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

diff <(cd $DIR1 && ls -laR) <(cd $DIR2 && ls -laR)

আমি এটি পরীক্ষা করিনি, সুতরাং কোনও সম্পাদনা স্বাগত :)


2
ডিরেক্টরিগুলির নামগুলি তারা ফলাফলের হিসাবেও কাজ করবে না।
ক্রিস ডাউন

যদি আমরা ডিরেক্টরি নামগুলির সাথে প্রথম কলামটি বাদ দেব? মত <(LS -laR | awk '{$ 1 = ""; মুদ্রণ}')
Volodymyr

সমস্ত লাইন ডিরেক্টরি নাম নয়, যাতে এটি সঠিকভাবে কাজ করে না।
ক্রিস ডাউন

প্রত্যেকের <()নিজস্ব পরিবেশ রয়েছে সেটির সুবিধা নিন । সম্পাদনা করা হয়েছে।
একটি সিভিএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.