উত্তর:
ধরুন আপনার 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
?) সিটিতে স্পষ্টত cmp
5-লাইন প্রোগ্রাম লেখার চেয়ে এই দৃ using়তার সাথে ব্যবহার করা সম্ভবত অনেক বেশি সমস্যা ...
cmp
করা এতটা কঠিন নয়, কারণ আউটপুটটি এত শক্তভাবে সীমাবদ্ধ। সম্পূর্ণ লাইনটি মিলানোর জন্য -x
বিকল্পটি ব্যবহার করা grep
সর্বাধিক বহিরাগত কেস (যেমন ফাইলের নামের ক্ষেত্রে নতুন লাইনেস) ব্যতীত সকলের যত্ন নেবে।
cmp
করতে পারেন যেdiff
এখানে কেন ভাল হবে ?