উত্তর:
ধরুন আপনার 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এমন একটি পাঠ্য ইউটিলিটি যা আপনাকে দুটি ফাইলের মধ্যে যে পার্থক্য রাখে না তার মধ্যে সমস্ত পার্থক্য দেখাতে একটি জটিল অ্যালগরিদম ব্যবহার করতে চলেছে।
যদি আপনার সিস্টেমে cmpজিএনইউ থেকে কমান্ড থাকে diffutils, তবে একটি বিকল্প
cmp -n 124665 file1 file2
দুটি ফাইলের সর্বাধিক প্রথম 124665 বাইট তুলনা করতে এবং সেগুলির মধ্যে পার্থক্য রয়েছে কিনা তা রিপোর্ট করুন - বা আরও সাধারণভাবে
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)বাইটের আকারের জন্য পরামর্শ দেওয়া ভাল কি? wcবাইট গণনা পেতে আসলে পুরো ফাইলটি খুলুন এবং প্রক্রিয়া করবেন ?
wcবাস্তবায়নগুলি কেসটিকে অনুকূল করে এবং একটি fstat()(বা / এবং ক lseek(SEEK_END)) করবে তাই এটি যতটা দক্ষ হবে তত কার্যকর হবে। অন্যদিকে, এটি stat -cজিএনইউ নির্দিষ্ট।
cmpআপনি সম্ভবত জিনু-নির্দিষ্ট ধরে নিতে পারেন stat।
জিএনইউ 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অনুরূপ কিছু করে তবে আমি চেক করি নি।
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সর্বাধিক বহিরাগত কেস (যেমন ফাইলের নামের ক্ষেত্রে নতুন লাইনেস) ব্যতীত সকলের যত্ন নেবে।
cmpকরতে পারেন যেdiffএখানে কেন ভাল হবে ?