লিনাক্স: ফাইলের তুলনা না করে ডিরেক্টরি কাঠামোর তুলনা করুন


55

দুটি ডিরেক্টরি স্ট্রাকচারের সাথে ফাইলের ডেটার তুলনা না করে সবচেয়ে ভাল ও সহজ উপায় কী? এটি ভাল কাজ করে:

diff -qr dir1 dir2_

তবে এটি আসলেই ধীর কারণ এটি ফাইলগুলির সাথে তুলনাও করে। এটি করার জন্য কি আলাদা বা অন্য কোনও সহজ ক্লাইমের সরঞ্জামের জন্য একটি স্যুইচ আছে?


"ডিরেক্টরি কাঠামো" দ্বারা, আপনি কি কেবল ডিরেক্টরি পথ বা ডিরেক্টরি এবং নন-ডিরেক্টরি ফাইল উভয়ের পাথ বুঝিয়েছেন?
intuited

হ্যাঁ, ফোল্ডার এবং ফাইল।
জোনা

1
-type dসেক্ষেত্রে আপনার @ স্লার্টিবার্টফেসের উত্তর থেকে বিকল্পটি সরিয়ে নেওয়া উচিত , বা আমার উত্তরটি দেখুন check
অনুপ্রেরণা

উত্তর:


36

নিম্নলিখিতটি (যদি আপনি ডিরেক্টরি 1 এবং ডিরেক্টরি 2 এর জন্য প্রথম ডিরেক্টরিটি প্রতিস্থাপন করেন) আপনার যা সন্ধান করছেন এবং দ্রুততার সাথে করা উচিত:

find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1

মৌলিক নীতিটি হ'ল এটি বেস ডিরেক্টরি এন ডিরেক্টরিগুলির সাথে সম্পর্কিত সাব-ডিরেক্টরি ডিরেক্টরি সহ সমস্ত ডিরেক্টরি মুদ্রণ করে।

আপনার ডিরেক্টরি ডিরেক্টরিতে অন্য কিছু না হলেও গাড়ি চালনা পেলে এটি নেমে যেতে পারে (উইয়ার্ড আউটপুট উত্পাদন করবে)।


এটি আমার পক্ষে ভাল নয়, কারণ যদি কোনও ডিরেক্টরিতে কয়েক হাজার ফাইলের ফোল্ডার থাকে তবে সেগুলি সমস্ত পৃথকভাবে তালিকাভুক্ত করা হয়, যখন diff -rqকেবলমাত্র রুট ডিরেক্টরিটি একটিতে উপস্থিত রয়েছে এবং এটি বহন করে।
ক্রিস জেফারসন

ওপিএস প্রশ্নের উত্তর দেওয়ার জন্য অন্তর্নিহিত দ্বারা (বছর আগে) নির্দেশিত হিসাবে, ফাইল
টাইপগুলি

আমি বুঝতে এবং সম্মান করি যে সমস্যার বিবৃতিটি পড়া। সে সময়টা আমার পড়া ছিল না। আপনি কি আপডেট করা প্রশ্নের উত্তর দেওয়ার জন্য আমার উত্তর সম্পাদনা করার পরামর্শ দিচ্ছেন? আমি ঠিক করছি যে আপনি যদি মনে করেন এটি কিছু লোকের পক্ষে সহায়ক হবে এবং আমি সমাধান এবং মন্তব্যটি ঠিক রেখে দিচ্ছি যে তারা এখনকার মতো, যা যুক্তিযুক্তভাবে কার্যকর বলে মনে হচ্ছে।
স্লেটারিবার্টফ্লাস্ট

34
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)

ভাঁজ করা কোনও সাধারণ বিভাগ সহ দুটি ডিরেক্টরি হায়ারারচিগুলির জন্য আপনাকে পাশাপাশি একটি সুন্দর দিকনির্দেশ দেবে।


এই সমাধান এলোমেলোভাবে ব্যর্থ হয়। যখন উইম অস্থায়ী ফাইল বর্ণনাকারী পড়েন (বা পুনরায় পড়েন), এটি ইতিমধ্যে চলে গেছে।
ডেনিলসন সা মিয়া

23

আমি সাধারণত rsyncএই কাজের জন্য ব্যবহার করি :

rsync -nav --delete DIR1/ DIR2

সর্বদা-n, ওরফে--dry-run, বিকল্পটিব্যবহার করতে খুব যত্নবান হনবা এটি ডিরেক্টরিগুলি সিঙ্ক্রোনাইজ করে (বিষয়বস্তু পরিবর্তন করে)।

এটি ফাইল পরিবর্তনের সময় এবং আকারের উপর ভিত্তি করে ফাইলগুলির তুলনা করবে ... আমি মনে করি আপনি এটি যা চান তা হ'ল বা এটি যদি তা করে তবে আপনার আপত্তি নেই? আমি বুঝতে পেরেছি যে আপনি কেবল এটি দ্রুত ঘটতে চান , ফাইল সামগ্রীর মধ্যে পার্থক্য উপেক্ষা করার দরকার নেই need আপনি যদি চান যে এটি অভিন্ন নামের সাথে পৃথক পৃথক ফাইল তালিকাভুক্ত না করে, আমি মনে করি --ignore-existingবিকল্পটির সংযোজন এটি করবে do

এছাড়াও সচেতন করে একটি নির্বাণ হতে হবে /শেষে DIR1এটি তুলনা কারণ হবে ডিরেক্টরির DIR1 সঙ্গে বিষয়বস্তু এর DIR2

আউটপুটটি কিছুটা ভার্বোজ হয়ে শেষ হয় তবে এটি আপনাকে দেখায় যে কোন ফাইল / ডিরেক্টরি পৃথক করে। উপস্থিত ফাইলগুলিতে / ডিরেক্টরিগুলি শব্দের সাথে উপস্থিত থাকবে DIR2এবং এতে নেই ।DIR1deleting

কিছু পরিস্থিতিতে, @ স্যালার্টিবার্টফ্লাসের উত্তরটি আরও উপযুক্ত হতে পারে, যদিও আপনাকে -type dনন-ডিরেক্টরি ফাইলগুলির তালিকা সক্ষম করার জন্য বিকল্পটি সরিয়ে ফেলতে হবে । rsyncআপনি তুলনা করার জন্য উল্লেখযোগ্য সংখ্যক ফাইল / ডিরেক্টরি পেয়ে থাকলে দ্রুত হবে।


দুর্দান্ত উত্তর। আরএসআইএনসি-র আউটপুটে এটি deleting...পাঠ্যটি লক্ষ্য করা শক্ত কিন্তু এখনও গতি বজায় রেখে ফাইলগুলির তুলনা করার এটি সম্ভবত সেরা উপায় of ওপির উদাহরণে যেমন আলাদা ফাইলগুলি প্রয়োজন হয় না তখন এখানে অন্যান্য উত্তরগুলি দ্রুত হয় তবে আমি সত্যিই এটি পছন্দ করি।
জোয়েল মেলন

এই আমি পরে ছিল। আমার কাছে বিশাল আকারের ডিরেক্টরি টি ডিরেক্টরিতে বিভিন্ন আকারের ফাইল ছিল এবং আমি কোনটি জানতে চাই। এটি মাত্র কয়েক সেকেন্ডের মধ্যে এই লক্ষ্য অর্জন করেছে।
সুপ্রজামী

সম্ভবত এটি কেবলমাত্র পঠনযোগ্য অ্যাক্সেসযুক্ত কোনও ব্যবহারকারীর সাথে এটি চালানো ভাল ধারণা। ভালো লেগেছে sudo -u nobody rsync -nav --delete d1 d2প্রদত্ত যে 'অন্যের জন্য পতাকার পড়া অনুমতি।
ব্যবহারকারী 1182474

এই সমাধানটি চালানোর সময় আমি "বিল্ডিং ফাইল তালিকা পেয়েছি ... সম্পন্ন হয়েছে \ n প্রেরিত এক্স বাইট পেয়েছে ওয়াই বাইট জেড বাইটস / সেকেন্ডের মোট আকার হ'ল একটি স্পিডআপ হ'ল বি" (যেখানে আমি সংখ্যার জন্য এক্সওয়াইজেবি প্রতিস্থাপন করেছি)। তার মানে কি সব কিছু অভিন্ন ছিল? যেহেতু এটি আরও নির্দিষ্ট কিছু উল্লেখ করেনি? অগ্রিম ধন্যবাদ
স্কট এইচ

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

18

এলএস উত্তরের অনুরূপ তবে আপনি যদি গাছ ইনস্টল করেন তবে আপনি এটি করতে পারেন

tree dir1 > out1
tree dir2 > out2
diff out1 out2

7
বা টেম্পফিলগুলি এড়াতে,diff <( tree dir1 ) <( tree dir2 )
জোয়েল মেলন

1
আমি iপতাকা সহ বৃক্ষ চালানোর পরামর্শ দিচ্ছি , যা গাছের লাইনগুলি ( tree -i dir1ইত্যাদি) মুদ্রণ করে না । যদি ডিরেক্টরি কাঠামো এক জায়গায় আলাদা হয় তবে অন্যান্য ফাইলগুলির সাথে মেলে যাতে |গাছের আউটপুটে আরও কম সংখ্যক চিহ্ন থাকতে পারে এবং ফাইল পাথগুলি অভিন্ন হলেও ডিফার্কগুলি সেই লাইনগুলি ধরতে পারে।
জিজ্ঞাসা

2
diff <(গাছ -i dir1) <(গাছ -i dir2) এখন পর্যন্ত সেরা উত্তর। প্রশ্নটি স্পষ্টভাবে ফাইলের বিষয়বস্তু না পড়ার জন্য বলেছে এমন সমস্ত উত্তরগুলি ডিফেট করতে বা রাইসাইএনসি-র প্রস্তাব দিতে আমি প্রলোভিত। দ্রষ্টব্য: দুটি পাইপ ব্যবহারের পরামর্শের জন্য বন্ধনীগুলির মধ্যে স্পেসের সাবধানে ব্যবহার করা দরকার, উদাহরণটি যথাযথভাবে অনুসরণ করুন। উদাহরণস্বরূপ, ব্যাকআপের পরে দুটি 20 জি ভলিউমের তুলনা করতে ট্রি উত্তরটি প্রায় 5 সেকেন্ড সময় নিয়েছিল। অন্যরা 20+ মিনিট সময় নিয়েছিল।
জেসন মরগান

3

আমি কেবল এই সমস্যার সমাধান খুঁজছিলাম। আমার যে সমাধানটি সবচেয়ে বেশি পছন্দ হয়েছিল তা হ'ল:

comm <(ls DIR1) <(ls DIR2)

এটি আপনাকে 3 টি কলাম দেয়: 1 - কেবল ডিআর 1, 2 এ ফাইল - কেবল ডিআর 2 এ 3, 3 - কেবল ডিআর 3 এ ফাইলগুলি আরও বিশদের জন্য এই ব্লগ পোস্টটি দেখুন।


কোথায় DIR3নির্দিষ্ট করা হয়? আমি যা দেখছি তা হ'ল DIR1এবং DIR2
মাইকেল ডার্স্ট

শুধুমাত্র সব ফাইল: আমি এটা চেষ্টা, এবং (আমি কি বলতে পারেন থেকে) আউটপুট ছিল DIR1মধ্যে কলামটি 1 , শুধুমাত্র সকল ফাইল DIR2মধ্যে কলাম 2 , এবং সমস্ত ফাইল উভয় দ্বারা ভাগ করা মধ্যে কলাম 3 । এই ধরণের দরকারী, কিন্তু আপনি কি জানেন যে কেউ কীভাবে 3 কলামটি ছড়িয়ে দিতে পারে এবং কেবলমাত্র পার্থক্য ছেড়ে যায়? আমার কাছে অনেকগুলি ফাইল বাছাই করার জন্য রয়েছে এবং এর বেশিরভাগটি অভিন্ন। আমার যা দেখতে হবে তা দেখতে কোন দরকার নেই।
মাইকেল ডারস্ট

1
এছাড়াও, আমি খুঁজে পেয়েছি যে comm <(ls DIR1) <(ls DIR2)পুনরাবৃত্তির সাথে কাজ করে না। তার জন্য আমি ব্যবহার করেছি comm <(ls -R1 DIR1) <(ls -R1 DIR2)ls -Rযাও recursively ডিরেক্টরি মাধ্যমে হামাগুড়ি দেয়, এবং ls -1(নোট যে একটি হল এক , কোনো এল ) তোলে lsপ্রতি লাইনে মুদ্রণ শুধুমাত্র একটি ফাইলের নাম।
মাইকেল ডারস্ট

@ মিশেল: comm -3(দেখুন man comm)
জাজ

2
ls > dir1.txt

ls > dir2.txt

তারপরে কেবল দুটি তালিকার পার্থক্য।


দেখে মনে হচ্ছে ওপি পথের একটি উত্তরাধিকার সূত্রে চায়। এটি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল পৃথক করবে। এটি বিতর্কযোগ্য, তবে সম্ভব, তিনি কেবল ডিরেক্টরি চান; তিনি ফাইলের বিষয়বস্তুর চেয়ে ফাইলের নাম চাইতে পারেন।
intuited

@ বিনষ্ট - আপনি ঠিক বলেছেন আমি এটি ভুল লিখেছি।
MDMarra

2

এটি সর্বোত্তম সমাধান

diff --brief -r dir1 dir2

- সংক্ষিপ্ত সুইচ কেবল ফাইলগুলি পৃথক কিনা তা রিপোর্ট করে, পার্থক্যের বিশদটি নয়।


1
ওপিতে ইতিমধ্যে -qপ্রশ্নে রয়েছে, এটির জন্য একটি নাম --brief। এই উত্তরটি কোনও নতুন তথ্য সরবরাহ করে না।
মাইকেল ডারস্ট

1
ওপি ফাইল সামগ্রীর তুলনা চায় না। But it's really slow because it's comparing files too.
জোয়েল মেলন

1

বিভিন্ন ফাইলগুলি পেতে "ডিফফ-কিআর" ব্যবহার করুন এবং তারপরে কেবলমাত্র ডিরেক্টরিগুলির মধ্যে একটিতে থাকা ফাইলের নামগুলি পেতে গ্রেপের সাথে ফাইলের তুলনা ফিল্টার করুন।

diff -qr dir1 dir2 | grep -v "Files.*differ" 

1

এটি মিলবে বলে আশা করা গাছগুলিতে হারিয়ে যাওয়া ফাইলগুলি সন্ধান করার জন্য আমার নির্দিষ্ট প্রয়োজনের জন্য কাজ করেছিল।

diff <( cd dir1; find * |sort ) <(cd dir2; find * | sort)

-3

আমি মনে করি কেবলমাত্র আরএসসিএনই ব্যবহারকারী user কেন?

ডিফ শুধুমাত্র ফাইল এবং ডিরেক্টরি রাখার কাঠামোর জন্য কার্যকর। আমরা যখন সিমলিংক ব্যবহার করি তখন ডিফ যথেষ্ট পরিমাণে প্রস্থান কোড দেয় না। সেক্ষেত্রে ডিএসএফ একই সাথে (বার, মাপ, নাম, টাইমস্ট্যাম্প, পয়েন্টিং সফটলিঙ্ক ইত্যাদি) 2 টি প্রস্থান কোড ফেরত দিতে পারে return

dir, src এবং dst ডিরেক্টরি ডিরেক্টরিতে অভিন্ন থাকলেও ফাইল সিস্টেমটি ফাইল অর্ডিংয়ের গ্যারান্টি দেয় না। সম্ভবত আপনার বাছাই করে ls আউটপুট ফিল্টার করা উচিত। তবে খাঁটি এলএস কেবল নোডের নাম প্রদর্শন করে।

নোড ধরণের জন্য ডিফ, সিএমপি, টেস্ট-এক্স সহ স্ক্রিপ্ট ব্যবহারযোগ্য হবে তবে অনেক পরীক্ষা / সিএমপি রান দ্বারা ওভারলোড সম্পর্কে মনে রাখা উচিত। স্ক্রিপ্টটি খুব ধীর হবে।

যথারীতি, আপনি যদি সাধারণ তথ্য "ডায়ারস হ'ল / অভিন্ন নয়" পেতে চান তবে আপনার -n (শুকনো) বিকল্পের সাহায্যে rsync ব্যবহার করা উচিত। আপনি কি আলাদা তা জানতে চাইলে ডিফ কমান্ডটি ব্যবহার করুন।


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