كيفية مقارنة ملفين نصيين في محطة طرفية لنظام Linux

النقاط الرئيسية

  • يتم استخدام الأمر diff لمقارنة ملفين وعرض الاختلافات بينهما، بما في ذلك التغييرات والحذف والإضافات.
  • يتضمن إخراج الأمر diff أرقام الأسطر والعلامات للإشارة إلى نوع الاختلاف (التغيير أو الحذف أو الإضافة).
  • تتوفر خيارات مختلفة لاستخدام الأمر diff، مثل عرض بيان موجز حول اختلافات الملفات، والعرض جنبًا إلى جنب، وتجاهل المسافات البيضاء وحالة الأحرف، وتوفير سياق للاختلافات.



هل تريد معرفة الاختلافات بين نسختين من ملف نصي؟ diff هذا هو الأمر الذي تحتاجه. سنوضح لك كيفية استخدامه diff على Linux وmacOS، الطريقة السهلة.


ما هو الأمر diff؟

ال diff يقوم الأمر بمقارنة ملفين وينتج قائمة بالاختلافات بينهما. ولكي نكون أكثر دقة، فإنه ينتج قائمة بالتغييرات التي يجب إجراؤها على الملف الأول، لجعله يتطابق مع الملف الثاني. إذا وضعت ذلك في الاعتبار، فسوف تجد أنه من الأسهل فهم الناتج من diff. ال diff تم تصميم الأمر للعثور على الاختلافات بين ملفات التعليمات البرمجية المصدرية وإنتاج إخراج يمكن قراءته والعمل عليه بواسطة برامج أخرى، مثل رقعة الأمر. في هذا البرنامج التعليمي، سنلقي نظرة على أكثر الطرق المفيدة التي تناسب البشر لاستخدام diff.


كيفية استخدام الأمر diff

دعنا نتعمق في تحليل ملفين. يحدد ترتيب الملفات على سطر الأوامر أي ملف diff يعتبره “الملف الأول” ويعتبره “الملف الثاني”. في المثال أدناه، alpha1 هو الملف الأول، وalpha2 هو الملف الثاني. يحتوي كلا الملفين على الأبجدية الصوتية لكن الملف الثاني، alpha2، خضع لبعض التحرير الإضافي حتى لا يصبح الملفان متطابقين.

يمكننا مقارنة الملفات بهذا الأمر. اكتب diff، مسافة، اسم الملف الأول، مسافة، اسم الملف الثاني، ثم اضغط على Enter.

diff alpha1 alpha2

الإخراج من أمر diff بدون خيارات

كيف يمكننا تحليل هذا الناتج؟ بمجرد أن تعرف ما الذي تبحث عنه، لن يكون الأمر سيئًا. يتم سرد كل اختلاف بدوره في عمود واحد، ويتم تسمية كل اختلاف. تحتوي التسمية على أرقام على جانبي حرف، مثل 4c4الرقم الأول هو رقم السطر في alpha1، والرقم الثاني هو رقم السطر في alpha2. يمكن أن يكون الحرف الموجود في المنتصف:


  • ج:يجب تغيير السطر الموجود في الملف الأول ليتوافق مع السطر الموجود في الملف الثاني.
  • د:يجب حذف السطر الموجود في الملف الأول ليتطابق مع الملف الثاني.
  • أ:يجب إضافة محتوى إضافي إلى الملف الأول لجعله يتطابق مع الملف الثاني.

ال 4c4 في مثالنا، أخبرنا أنه يجب تغيير السطر الرابع من alpha1 ليتوافق مع السطر الرابع من alpha2. هذا هو الاختلاف الأول بين الملفين اللذين diff وجد.

الخطوط التي تبدأ بـ < ارجع إلى الملف الأول، في مثالنا alpha1، والأسطر التي تبدأ بـ > راجع الملف الثاني، alpha2. السطر < Delta يخبرنا أن كلمة دلتا هي محتوى السطر الرابع في alpha1. السطر > Dave يخبرنا أن كلمة Dave هي محتوى السطر الرابع في alpha2. ولتلخيص الأمر، نحتاج إلى استبدال Delta بـ Dave في السطر الرابع في alpha1، لجعل هذا السطر مطابقًا في كلا الملفين.


يتم الإشارة إلى التغيير التالي بواسطة 12c12بتطبيق نفس المنطق، يخبرنا هذا أن السطر 12 في alpha1 يحتوي على كلمة Lima، ولكن السطر 12 في alpha2 يحتوي على كلمة Linux.

يشير التغيير الثالث إلى سطر تم حذفه من alpha2. التسمية 21d20 تم فك شفرته على النحو التالي “يجب حذف السطر 21 من الملف الأول لجعل كلا الملفين متزامنين من السطر 20 فصاعدًا.” < Uniform يُظهر لنا السطر محتوى السطر الذي يجب حذفه من alpha1.

الفرق الرابع هو المسمى 26a26,28يشير هذا التغيير إلى ثلاثة أسطر إضافية تمت إضافتها إلى alpha2. لاحظ 26,28 في الملصق. تمثل الأرقام المكونة من سطرين والمفصولة بفاصلة نطاقًا من أرقام الأسطر. في هذا المثال، يتراوح النطاق من السطر 26 إلى السطر 28. يتم تفسير الملصق على أنه “في السطر 26 في الملف الأول، أضف الأسطر من 26 إلى 28 من الملف الثاني”. تظهر لنا الأسطر الثلاثة في alpha2 التي يجب إضافتها إلى alpha1. تحتوي هذه الأسطر على الكلمات Quirk وStrange وCharm.


أوامر مفيدة من سطر واحد مع اختلاف

إذا كان كل ما تريد معرفته هو ما إذا كان الملفان متماثلين، فاستخدم -s (خيار الإبلاغ عن الملفات المتطابقة).

diff -s alpha1 alpha3

مخرجات أمر diff مع الخيار -s

يمكنك استخدام -q خيار (مختصر) للحصول على بيان موجز بنفس القدر حول اختلاف ملفين.

diff -q alpha1 alpha2

مخرجات أمر diff مع الخيار -q

أحد الأشياء التي يجب الانتباه إليها هو أنه مع وجود ملفين متطابقين،-q (الخيار الموجز) يغلق تمامًا ولا يبلغ عن أي شيء على الإطلاق.


وجهة نظر بديلة للاختلاف

ال -y يستخدم خيار (جنبًا إلى جنب) تخطيطًا مختلفًا لوصف اختلافات الملفات. غالبًا ما يكون من الملائم استخدام -W خيار (العرض) مع عرض جنبًا إلى جنب، للحد من عدد الأعمدة المعروضة. وهذا يتجنب الخطوط الملتفة القبيحة التي تجعل القراءة صعبة. لقد أخبرنا هنا diff لإنتاج عرض متجاور وتقييد الإخراج إلى 70 عمودًا.

diff -y -W 70 alpha1 alpha2

إخراج أمر diff مع العرض جنبًا إلى جنب

يظهر الملف الأول على سطر الأوامر، alpha1، على اليسار والسطر الثاني على سطر الأوامر، alpha2، على اليمين. يتم عرض الأسطر من كل ملف جنبًا إلى جنب. توجد أحرف مؤشر بجانب تلك الأسطر في alpha2 التي تم تغييرها أو حذفها أو إضافتها.


  • |:السطر الذي تم تغييره في الملف الثاني.
  • <:سطر تم حذفه من الملف الثاني.
  • >:سطر تمت إضافته إلى الملف الثاني وهو غير موجود في الملف الأول.

إذا كنت تفضل ملخصًا أكثر إحكامًا للاختلافات بين الملفات، فاستخدم --suppress-common-lines الخيار. هذا يجبر diff لإدراج الأسطر التي تم تغييرها أو إضافتها أو حذفها فقط.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

مخرجات أمر diff مع خيار --suppress-common-lines

أضف لمسة من اللون لإخراج مختلف

هناك أداة أخرى تسمى colordiff يضيف تسليط الضوء على اللون إلى diff الإخراج. وهذا يجعل من الأسهل بكثير رؤية الخطوط التي بها اختلافات.


يستخدم apt-get لتثبيت هذه الحزمة على نظامك إذا كنت تستخدم Ubuntu أو أي توزيع آخر يعتمد على Debian. في توزيعات Linux الأخرى، استخدم أداة إدارة الحزم الخاصة بتوزيعة Linux الخاصة بك بدلاً من ذلك.

sudo apt-get install colordiff

يستخدم colordiff تمامًا كما تستخدم diff.

مخرجات أمر colordiff بدون خيارات

في الحقيقة، colordiff هو غلاف لـ diff، و diff يقوم بكل العمل خلف الكواليس. ولهذا السبب، فإن كل diff الخيارات سوف تعمل مع colordiff.

مخرجات أمر colordiff مع خيار --suppress-common-lines


توفير بعض السياق

لإيجاد أرضية مشتركة بين عرض جميع الأسطر في الملفات على الشاشة وبين إدراج الأسطر المتغيرة فقط، يمكننا أن نسأل diff لتوفير بعض السياق. هناك طريقتان للقيام بذلك. كلتا الطريقتين تحققان نفس الغرض، وهو إظهار بعض الأسطر قبل وبعد كل سطر متغير. ستتمكن من رؤية ما يحدث في الملف في المكان الذي تم فيه اكتشاف الاختلاف.

الطريقة الأولى تستخدم -c خيار (السياق المنسوخ).

colordiff -c alpha1 alpha2

إخراج colordiff مع الخيار -c

ال diff يحتوي الإخراج على رأس. يسرد الرأس اسمي الملفين وأوقات تعديلهما. توجد علامات النجمة (*) قبل اسم الملف الأول والشرطات (-) قبل اسم الملف الثاني. سيتم استخدام علامات النجمة والشرطات للإشارة إلى الملف الذي تنتمي إليه الأسطر الموجودة في المخرجات.


يشير خط النجوم الذي يحتوي على 1 و7 في المنتصف إلى أننا ننظر إلى الأسطر من alpha1. وعلى وجه التحديد، فإننا ننظر إلى الأسطر من الأول إلى السابع. تم وضع علامة على كلمة Delta على أنها تغيرت. وهي تحتوي على علامة تعجب ( ! ) بجانبه، وهو باللون الأحمر. هناك ثلاثة أسطر من النص غير المتغير معروضة قبل وبعد هذا السطر حتى نتمكن من رؤية سياق هذا السطر في الملف.

يخبرنا خط الشرطات الذي يحتوي على 1,7 في المنتصف أننا ننظر الآن إلى الخطوط من alpha2. مرة أخرى، ننظر إلى الخطوط من الأول إلى السابع، مع تمييز كلمة Dave في السطر الرابع على أنها مختلفة.

ثلاثة أسطر من السياق أعلى وأسفل كل تغيير هي القيمة الافتراضية. يمكنك تحديد عدد أسطر السياق التي تريدها diff لتوفير. للقيام بذلك، استخدم -C (سياق منسوخ) الخيار بحرف “C” كبير وتوفير عدد الأسطر التي تريدها:

colordiff -C 2 alpha1 alpha2


إخراج colordiff مع الخيار -C 2

الثاني diff الخيار الذي يقدم السياق هو -u خيار (السياق الموحد).

colordiff -u alpha1 alpha2

إخراج colordiff مع الخيار -u

كما في السابق، لدينا رأس على المخرجات. تم تسمية الملفين، وتم عرض أوقات تعديلهما. هناك شرطات (-) قبل اسم ألفا 1 وعلامة الجمع (+) قبل اسم alpha2. وهذا يخبرنا أنه سيتم استخدام الشرطات للإشارة إلى alpha1 وسيتم استخدام علامات الجمع للإشارة إلى alpha2. تنتشر في جميع أنحاء القائمة أسطر تبدأ بعلامات (@). تشير هذه الخطوط إلى بداية كل اختلاف. كما تخبرنا أيضًا بالخطوط التي يتم عرضها من كل ملف.


تظهر لنا الخطوط الثلاثة قبل وبعد الخط الذي تم وضع علامة عليه باعتباره مختلفًا حتى نتمكن من رؤية سياق الخط المتغير. في العرض الموحد، تظهر الخطوط ذات الاختلاف فوق بعضها البعض. يسبق الخط من alpha1 شرطة ويسبق الخط من alpha2 علامة زائد. يحقق هذا العرض في ثمانية أسطر ما استغرق عرض السياق المنسوخ أعلاه خمسة عشر سطرًا للقيام به.

كما تتوقع، يمكننا أن نسأل diff لتوفير العدد الدقيق لأسطر السياق الموحد الذي نرغب في رؤيته. للقيام بذلك، استخدم -U (السياق الموحد) الخيار بحرف “U” كبير وتوفير عدد الأسطر التي تريدها:

colordiff -U 2 alpha1 alpha2

إخراج colordiff مع الخيار -U 2


تجاهل المسافات البيضاء وحالة الأحرف

دعنا نحلل ملفين آخرين، test4 وtest5. يحتوي الملفان على أسماء ستة أبطال خارقين.

colordiff -y -W 70 test4 test5

إخراج colordiff على ملفات test4 وtest5

وتظهر النتائج أن diff لا يجد أي اختلاف في خطوط Black Widow وSpider-Man وThor. كما أنه يشير إلى تغييرات في خطوط Captain America وIronman وThe Hulk.

إذن ما هو الاختلاف؟ حسنًا، في الاختبار الخامس، يُكتب اسم Hulk بحرف “h” صغير، ويوجد مسافة إضافية بين اسمي Captain America وAmerica. حسنًا، هذا واضح للعيان، ولكن ما الخطأ في سطر Ironman؟ لا توجد فروق واضحة. إليك قاعدة عامة جيدة. إذا لم تتمكن من رؤيتها، فالإجابة هي المسافة البيضاء. من المؤكد تقريبًا أن هناك مسافة أو اثنتين ضالتين، أو حرف علامة تبويب، في نهاية هذا السطر.


إذا لم تكن مهمة بالنسبة لك، يمكنك إصدار التعليمات diff لتجاهل أنواع معينة من اختلافات الخطوط، بما في ذلك:

  • -أنا:تجاهل الاختلافات في الحالة.
  • :تجاهل المسافة البيضاء الزائدة.
  • :تجاهل التغييرات في مقدار المساحة البيضاء.
  • :تجاهل كافة تغييرات المساحة البيضاء.

دعنا نطلب من diff التحقق من هذين الملفين مرة أخرى، ولكن هذه المرة لتجاهل أي اختلافات في الحالة.

colordiff -i -y -W 70 test4 test5

الإخراج من colordiff يتجاهل حالة الأحرف

الآن، تعتبر الأسطر التي تحتوي على “The Hulk” و”The hulk” متطابقة، ولا يتم تمييز أي اختلاف في حالة الحرف الصغير “h”. دعنا نسأل diff لتجاهل المسافات البيضاء الزائدة أيضًا.

colordiff -i -Z -y -W 70 test4 test5


يتجاهل الإخراج من colordiff المسافة البيضاء الزائدة

كما هو متوقع، فإن المساحة البيضاء الزائدة لابد وأن تكون هي الفارق في خط الرجل الحديدي لأن diff لم يعد هناك فرق بين هذا الخط. وهذا يترك لنا كابتن أمريكا. دعنا نسأل diff لتجاهل حالة الأحرف وتجاهل جميع مشكلات المسافات البيضاء.

colordiff -i -w -y -W 70 test4 test5

يتجاهل الإخراج من colordiff كل المساحات البيضاء

بالقول diff لتجاهل الاختلافات التي لا تهمنا، diff يخبرنا أنه بالنسبة لأغراضنا، الملفات متطابقة.


ال diff يحتوي الأمر على العديد من الخيارات الأخرى، لكن أغلبها يتعلق بإنتاج مخرجات قابلة للقراءة بواسطة الآلة. يمكن مراجعة هذه الخيارات على Linux صفحة الرجلستتيح لك الخيارات التي استخدمناها في الأمثلة أعلاه تعقب جميع الاختلافات بين إصدارات ملفات النصوص لديك، باستخدام سطر الأوامر والعين البشرية.

أضف تعليق