ফাইল 1 ফাইল 2 এর উপসর্গ কিনা তা কীভাবে পরীক্ষা করবেন?


13

আমার কাছে দুটি ফাইল আছে 124665 এবং 124858 সাইজের বাইটে এবং ফাইলটি 1 ফাইল 2 এর উপসাগর কিনা তা যাচাই করতে চাই।

উত্তর:


11

ধরুন আপনার file1ভেরিয়েবলের আকার রয়েছে FILE1_SZএবং আপনার headপ্রয়োগটি (অ-মানক) -cবিকল্পটিকে সমর্থন করে :

if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
    echo "file1 is a prefix of file2"
else
    echo "file1 is not a prefix of file2"
fi

@ স্টাফেনচাজেলাস আপনি কি দয়া করে ব্যাখ্যা cmpকরতে পারেন যে diffএখানে কেন ভাল হবে ?
জোসেফ আর

7
কারণ cmpবাইট তুলনা করার জন্য একটি সাধারণ বাইট করে এবং এটি কোনও পার্থক্য সন্ধান করার সাথে সাথে ফিরে আসে, অন্যদিকে diffএমন একটি পাঠ্য ইউটিলিটি যা আপনাকে দুটি ফাইলের মধ্যে যে পার্থক্য রাখে না তার মধ্যে সমস্ত পার্থক্য দেখাতে একটি জটিল অ্যালগরিদম ব্যবহার করতে চলেছে।
স্টাফেন চেজেলাস

12

যদি আপনার সিস্টেমে cmpজিএনইউ থেকে কমান্ড থাকে diffutils, তবে একটি বিকল্প

cmp -n 124665 file1 file2

দুটি ফাইলের সর্বাধিক প্রথম 124665 বাইট তুলনা করতে এবং সেগুলির মধ্যে পার্থক্য রয়েছে কিনা তা রিপোর্ট করুন - বা আরও সাধারণভাবে

cmp -n "$(wc -c < file1)" file1 file2

@ স্টাফেনচাজেলাস আমি এখানে দ্বিতীয় অনুমান করছি তবে $(stat -c %s file1)বাইটের আকারের জন্য পরামর্শ দেওয়া ভাল কি? wcবাইট গণনা পেতে আসলে পুরো ফাইলটি খুলুন এবং প্রক্রিয়া করবেন ?
স্টিল্ড্রাইভার

2
না, বেশিরভাগ wcবাস্তবায়নগুলি কেসটিকে অনুকূল করে এবং একটি fstat()(বা / এবং ক lseek(SEEK_END)) করবে তাই এটি যতটা দক্ষ হবে তত কার্যকর হবে। অন্যদিকে, এটি stat -cজিএনইউ নির্দিষ্ট।
স্টাফেন চেজেলাস

1
যদিও আপনার যদি জিএনইউ-নির্দিষ্ট প্রয়োজন হয় তবে cmpআপনি সম্ভবত জিনু-নির্দিষ্ট ধরে নিতে পারেন stat
বর্মার

3

জিএনইউ cmpএকটি সহজ উপায়ে সমস্যার সমাধান করতে পারে:

cmp file1 file2

এখানে সম্ভাব্য চারটি আউটপুট রয়েছে (কোনও ধরণের ত্রুটি বাদ দিয়ে)।

  • কোনও আউটপুট নেই: ফাইলগুলি অভিন্ন।

  • cmp: EOF on file1: ফাইল 1 ফাইল 2 এর একটি উপসর্গ।

  • cmp: EOF on file2: ফাইল 2 ফাইল 1 এর একটি উপসর্গ।

  • file1 file2 differ: byte NNN, line MMM: না হয় অন্য একটি উপসর্গ।

দুর্ভাগ্যক্রমে স্ক্রিপ্টে এটি ব্যবহার করা কিছুটা বিশ্রীজনক, যেহেতু এই কেসগুলি প্রস্থান কোডটিতে আলাদা করা হয় বলে মনে হয় না। অধিকন্তু, EOF on file1বার্তা, stderr হবে যেতে যখন file1 file2 differবার্তা stdout- এ চলে যায়।

আমি অনুমান করি যে অন্যান্য সংস্করণগুলিও cmpঅনুরূপ কিছু করে তবে আমি চেক করি নি।


1
cmpএটি কোনও জিএনইউ-কেবলমাত্র আদেশ নয় বা এটির উদ্ভবও সেখানে হয়নি, এটি ইতিমধ্যে 70 এর দশকের গোড়ার দিকে ইউনিক্সের প্রথম সংস্করণে ছিল। -nবিকল্প গনুহ নির্দিষ্ট যদিও।
স্টাফেন চেজেলাস

আপনি করতে পারেনcmp file1 file2 2>&1 | grep EOF on file1
ডেভিড জেড

@ স্টাফেনচাজেলাস: এটি সত্য। আমি বোঝাতে চাইনি যে cmpএটি জিএনইউর পক্ষে অনন্য cmpছিল, কেবলমাত্র জিএনইউই আমি চেষ্টা করেছিলাম version আমি স্পষ্ট করে একটি বাক্য যুক্ত করেছি।
নেট এল্ডারেজ

@ ডেভিডজেড: হ্যাঁ, আপনি পারতেন, তবে এটি কিছুটা কম শক্তিশালী হয়। কল্পনা করুন যে আপনি ব্যবহারকারী দ্বারা সরবরাহিত দুটি ফাইল দিয়ে এটি করার চেষ্টা করছেন এবং তার একটির নাম file1এবং অন্যটির নাম দেওয়া হয়েছে file12। (বা আরও খারাপ, দ্বিতীয় ফাইলটির নাম দেওয়া হলে কী হবে EOF on file1?) সিটিতে স্পষ্টত cmp5-লাইন প্রোগ্রাম লেখার চেয়ে এই দৃ using়তার সাথে ব্যবহার করা সম্ভবত অনেক বেশি সমস্যা ...
ন্যাট এল্ড্রেজ

যদিও প্রাসঙ্গিক বিষয় থাকতে পারে যেখানে একটি সি প্রোগ্রাম ব্যবহারিক নয়। এবং এটিকে মোটামুটি শক্তিশালী cmpকরা এতটা কঠিন নয়, কারণ আউটপুটটি এত শক্তভাবে সীমাবদ্ধ। সম্পূর্ণ লাইনটি মিলানোর জন্য -xবিকল্পটি ব্যবহার করা grepসর্বাধিক বহিরাগত কেস (যেমন ফাইলের নামের ক্ষেত্রে নতুন লাইনেস) ব্যতীত সকলের যত্ন নেবে।
ডেভিড জেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.