আমি কি `ডিফফ - কিউ'র বিপরীতে পেতে পারি - অভিন্ন ফাইলগুলির বিষয়বস্তু প্রিন্ট না করে মিলে


13

আমার একটি ডিরেক্টরিতে বেশ কয়েকটি ফাইল রয়েছে এবং আমি তা পরীক্ষা করতে চাই যে সেগুলি সমস্তই অনন্য। : সরলতার জন্য, ধরুন আমি তিনটি ফাইল আছে যাক foo.txt, bar.txtএবং baz.txt। আমি যদি এই লুপটি চালাই তবে আমি সেগুলি একে অপরের বিরুদ্ধে যাচাই করব:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

আমি যে শত শত ফাইলের সাথে ডিল করতে চাইছি তার জন্য এটি বেশ অপঠনযোগ্য হয়ে উঠবে; মেলে না এমন ফাইলগুলির তালিকা তৈরি করা ভাল better এবং তারপরে আমি দ্রুত তালিকাটি দেখতে পারি এবং নিশ্চিত করতে পারি যে ফাইলগুলি কেবল নিজের সাথে মেলে। ম্যানপেজ থেকে, আমি ভাবতাম যে -sবিকল্পটি এটি সম্পাদন করবে:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... তবে এটি আসলে এছাড়াও যে কোনো ফাইল ভিন্ন সমগ্র বিষয়বস্তু ছাপে। এই আচরণটি দমন করার কোনও উপায় আছে, তাই আমি কেবল উপরের আচরণটি পাই?

বিকল্পভাবে, এমন কি অন্য কোনও সরঞ্জাম রয়েছে যা এটি সম্পাদন করতে পারে ?

উত্তর:


6

আপনি যদি কেবল দুটি ফাইল অভিন্ন কিনা তা পরীক্ষা করতে চান তবে ব্যবহার করুন cmp। শুধুমাত্র অভিন্ন ফাইলগুলির জন্য আউটপুট পেতে, আপনি ব্যবহার করতে পারেন

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff পার্থক্যগুলির একটি সংক্ষিপ্ত, মানব-পঠনযোগ্য তালিকা তৈরি করার চেষ্টা করে এবং এটি বেশ সময় নিতে পারে, সুতরাং আপনার যদি প্রয়োজন না হয় তবে ওভারহেড এড়িয়ে যান।


12

এই কৌতুক করতে হবে:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

কোথায় dir1এবং dir2আপনার দুটি ডিরেক্টরি হয়।

আপনি যদি কেবলমাত্র এর থেকে মিলে যাওয়া ডিরেক্টরিগুলি মুদ্রণ করতে চান dir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

এবং তেমনিভাবে, আপনি যদি কেবল মিলে যাওয়া ডিরেক্টরিগুলি থেকে মুদ্রণ করতে চান dir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

আমি ঠিক তাই খুঁজছিলাম, ধন্যবাদ!
জোশুয়া সোইলিও

diff -qrsবড় ফাইলগুলির সাথে তুলনা করার সময় ব্যবহার করুন (নিরিবিলি প্রিন্টিংগুলিকে
নিঃশব্দে

4

এই উদ্দেশ্যে রচিত দ্রুততম সরঞ্জামটি হ'ল fdupes (এটি ফেডোরা এবং উবুন্টুর প্যাকেজ রেপোতে উপলব্ধ এবং…)

ব্যবহার:

fdupes -r dir1 dir2

2

যদি আপনাকে কোনও তালিকায় অভিন্ন ফাইলগুলি সন্ধান করতে হয় তবে প্রথমে আকার অনুসারে বাছাই করুন, উদাহরণস্বরূপ

ls -S

তারপরে অভিন্ন আকারের ফাইলগুলির প্রতিটি গ্রুপের জন্য md5sumসহজেই কোনটি অভিন্ন তা দেখতে তাদের চালনা করুন।

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

dd if=file bs=512 count=1 | md5sum

এবং তারপরে সন্দেহজনক ফাইলগুলিতে একটি সম্পূর্ণ চেকসাম সম্পাদন করুন।

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