النقاط الرئيسية
- يتم استخدام الأمر diff لمقارنة ملفين وعرض الاختلافات بينهما، بما في ذلك التغييرات والحذف والإضافات.
- يتضمن إخراج الأمر diff أرقام الأسطر والعلامات للإشارة إلى نوع الاختلاف (التغيير أو الحذف أو الإضافة).
- تتوفر خيارات مختلفة لاستخدام الأمر diff، مثل عرض بيان موجز حول اختلافات الملفات، والعرض جنبًا إلى جنب، وتجاهل المسافات البيضاء وحالة الأحرف، وتوفير سياق للاختلافات.
هل تريد معرفة الاختلافات بين نسختين من ملف نصي؟ diff
هذا هو الأمر الذي تحتاجه. سنوضح لك كيفية استخدامه diff
على Linux وmacOS، الطريقة السهلة.
ما هو الأمر diff؟
ال diff
يقوم الأمر بمقارنة ملفين وينتج قائمة بالاختلافات بينهما. ولكي نكون أكثر دقة، فإنه ينتج قائمة بالتغييرات التي يجب إجراؤها على الملف الأول، لجعله يتطابق مع الملف الثاني. إذا وضعت ذلك في الاعتبار، فسوف تجد أنه من الأسهل فهم الناتج من diff
. ال diff
تم تصميم الأمر للعثور على الاختلافات بين ملفات التعليمات البرمجية المصدرية وإنتاج إخراج يمكن قراءته والعمل عليه بواسطة برامج أخرى، مثل رقعة الأمر. في هذا البرنامج التعليمي، سنلقي نظرة على أكثر الطرق المفيدة التي تناسب البشر لاستخدام diff
.
كيفية استخدام الأمر diff
دعنا نتعمق في تحليل ملفين. يحدد ترتيب الملفات على سطر الأوامر أي ملف diff
يعتبره “الملف الأول” ويعتبره “الملف الثاني”. في المثال أدناه، alpha1 هو الملف الأول، وalpha2 هو الملف الثاني. يحتوي كلا الملفين على الأبجدية الصوتية لكن الملف الثاني، alpha2، خضع لبعض التحرير الإضافي حتى لا يصبح الملفان متطابقين.
يمكننا مقارنة الملفات بهذا الأمر. اكتب diff
، مسافة، اسم الملف الأول، مسافة، اسم الملف الثاني، ثم اضغط على Enter.
diff alpha1 alpha2
كيف يمكننا تحليل هذا الناتج؟ بمجرد أن تعرف ما الذي تبحث عنه، لن يكون الأمر سيئًا. يتم سرد كل اختلاف بدوره في عمود واحد، ويتم تسمية كل اختلاف. تحتوي التسمية على أرقام على جانبي حرف، مثل 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
يمكنك استخدام -q
خيار (مختصر) للحصول على بيان موجز بنفس القدر حول اختلاف ملفين.
diff -q alpha1 alpha2
أحد الأشياء التي يجب الانتباه إليها هو أنه مع وجود ملفين متطابقين،-q
(الخيار الموجز) يغلق تمامًا ولا يبلغ عن أي شيء على الإطلاق.
وجهة نظر بديلة للاختلاف
ال -y
يستخدم خيار (جنبًا إلى جنب) تخطيطًا مختلفًا لوصف اختلافات الملفات. غالبًا ما يكون من الملائم استخدام -W
خيار (العرض) مع عرض جنبًا إلى جنب، للحد من عدد الأعمدة المعروضة. وهذا يتجنب الخطوط الملتفة القبيحة التي تجعل القراءة صعبة. لقد أخبرنا هنا diff
لإنتاج عرض متجاور وتقييد الإخراج إلى 70 عمودًا.
diff -y -W 70 alpha1 alpha2
يظهر الملف الأول على سطر الأوامر، alpha1، على اليسار والسطر الثاني على سطر الأوامر، alpha2، على اليمين. يتم عرض الأسطر من كل ملف جنبًا إلى جنب. توجد أحرف مؤشر بجانب تلك الأسطر في alpha2 التي تم تغييرها أو حذفها أو إضافتها.
- |:السطر الذي تم تغييره في الملف الثاني.
- <:سطر تم حذفه من الملف الثاني.
- >:سطر تمت إضافته إلى الملف الثاني وهو غير موجود في الملف الأول.
إذا كنت تفضل ملخصًا أكثر إحكامًا للاختلافات بين الملفات، فاستخدم --suppress-common-lines
الخيار. هذا يجبر diff
لإدراج الأسطر التي تم تغييرها أو إضافتها أو حذفها فقط.
diff -y -W 70 --suppress-common-lines alpha1 alpha2
أضف لمسة من اللون لإخراج مختلف
هناك أداة أخرى تسمى colordiff
يضيف تسليط الضوء على اللون إلى diff
الإخراج. وهذا يجعل من الأسهل بكثير رؤية الخطوط التي بها اختلافات.
يستخدم apt-get
لتثبيت هذه الحزمة على نظامك إذا كنت تستخدم Ubuntu أو أي توزيع آخر يعتمد على Debian. في توزيعات Linux الأخرى، استخدم أداة إدارة الحزم الخاصة بتوزيعة Linux الخاصة بك بدلاً من ذلك.
sudo apt-get install colordiff
يستخدم colordiff
تمامًا كما تستخدم diff
.
في الحقيقة، colordiff
هو غلاف لـ diff
، و diff
يقوم بكل العمل خلف الكواليس. ولهذا السبب، فإن كل diff
الخيارات سوف تعمل مع colordiff
.
توفير بعض السياق
لإيجاد أرضية مشتركة بين عرض جميع الأسطر في الملفات على الشاشة وبين إدراج الأسطر المتغيرة فقط، يمكننا أن نسأل diff
لتوفير بعض السياق. هناك طريقتان للقيام بذلك. كلتا الطريقتين تحققان نفس الغرض، وهو إظهار بعض الأسطر قبل وبعد كل سطر متغير. ستتمكن من رؤية ما يحدث في الملف في المكان الذي تم فيه اكتشاف الاختلاف.
الطريقة الأولى تستخدم -c
خيار (السياق المنسوخ).
colordiff -c alpha1 alpha2
ال diff
يحتوي الإخراج على رأس. يسرد الرأس اسمي الملفين وأوقات تعديلهما. توجد علامات النجمة (*
) قبل اسم الملف الأول والشرطات (-
) قبل اسم الملف الثاني. سيتم استخدام علامات النجمة والشرطات للإشارة إلى الملف الذي تنتمي إليه الأسطر الموجودة في المخرجات.
يشير خط النجوم الذي يحتوي على 1 و7 في المنتصف إلى أننا ننظر إلى الأسطر من alpha1. وعلى وجه التحديد، فإننا ننظر إلى الأسطر من الأول إلى السابع. تم وضع علامة على كلمة Delta على أنها تغيرت. وهي تحتوي على علامة تعجب ( !
) بجانبه، وهو باللون الأحمر. هناك ثلاثة أسطر من النص غير المتغير معروضة قبل وبعد هذا السطر حتى نتمكن من رؤية سياق هذا السطر في الملف.
يخبرنا خط الشرطات الذي يحتوي على 1,7 في المنتصف أننا ننظر الآن إلى الخطوط من alpha2. مرة أخرى، ننظر إلى الخطوط من الأول إلى السابع، مع تمييز كلمة Dave في السطر الرابع على أنها مختلفة.
ثلاثة أسطر من السياق أعلى وأسفل كل تغيير هي القيمة الافتراضية. يمكنك تحديد عدد أسطر السياق التي تريدها diff
لتوفير. للقيام بذلك، استخدم -C
(سياق منسوخ) الخيار بحرف “C” كبير وتوفير عدد الأسطر التي تريدها:
colordiff -C 2 alpha1 alpha2
الثاني diff
الخيار الذي يقدم السياق هو -u
خيار (السياق الموحد).
colordiff -u alpha1 alpha2
كما في السابق، لدينا رأس على المخرجات. تم تسمية الملفين، وتم عرض أوقات تعديلهما. هناك شرطات (-
) قبل اسم ألفا 1 وعلامة الجمع (+
) قبل اسم alpha2. وهذا يخبرنا أنه سيتم استخدام الشرطات للإشارة إلى alpha1 وسيتم استخدام علامات الجمع للإشارة إلى alpha2. تنتشر في جميع أنحاء القائمة أسطر تبدأ بعلامات (@
). تشير هذه الخطوط إلى بداية كل اختلاف. كما تخبرنا أيضًا بالخطوط التي يتم عرضها من كل ملف.
تظهر لنا الخطوط الثلاثة قبل وبعد الخط الذي تم وضع علامة عليه باعتباره مختلفًا حتى نتمكن من رؤية سياق الخط المتغير. في العرض الموحد، تظهر الخطوط ذات الاختلاف فوق بعضها البعض. يسبق الخط من alpha1 شرطة ويسبق الخط من alpha2 علامة زائد. يحقق هذا العرض في ثمانية أسطر ما استغرق عرض السياق المنسوخ أعلاه خمسة عشر سطرًا للقيام به.
كما تتوقع، يمكننا أن نسأل diff
لتوفير العدد الدقيق لأسطر السياق الموحد الذي نرغب في رؤيته. للقيام بذلك، استخدم -U
(السياق الموحد) الخيار بحرف “U” كبير وتوفير عدد الأسطر التي تريدها:
colordiff -U 2 alpha1 alpha2
تجاهل المسافات البيضاء وحالة الأحرف
دعنا نحلل ملفين آخرين، test4 وtest5. يحتوي الملفان على أسماء ستة أبطال خارقين.
colordiff -y -W 70 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
الآن، تعتبر الأسطر التي تحتوي على “The Hulk” و”The hulk” متطابقة، ولا يتم تمييز أي اختلاف في حالة الحرف الصغير “h”. دعنا نسأل diff
لتجاهل المسافات البيضاء الزائدة أيضًا.
colordiff -i -Z -y -W 70 test4 test5
كما هو متوقع، فإن المساحة البيضاء الزائدة لابد وأن تكون هي الفارق في خط الرجل الحديدي لأن diff
لم يعد هناك فرق بين هذا الخط. وهذا يترك لنا كابتن أمريكا. دعنا نسأل diff
لتجاهل حالة الأحرف وتجاهل جميع مشكلات المسافات البيضاء.
colordiff -i -w -y -W 70 test4 test5
بالقول diff
لتجاهل الاختلافات التي لا تهمنا، diff
يخبرنا أنه بالنسبة لأغراضنا، الملفات متطابقة.
ال diff
يحتوي الأمر على العديد من الخيارات الأخرى، لكن أغلبها يتعلق بإنتاج مخرجات قابلة للقراءة بواسطة الآلة. يمكن مراجعة هذه الخيارات على Linux صفحة الرجلستتيح لك الخيارات التي استخدمناها في الأمثلة أعلاه تعقب جميع الاختلافات بين إصدارات ملفات النصوص لديك، باستخدام سطر الأوامر والعين البشرية.