با دستور diff تفاوت بین دو فایل را پیدا کنید و با patch آن تغییرات را روی فایل اصلی اعمال کنید
دستور diff یکی از ابزارهای خط فرمان در لینوکس و یونیکس است که برای پیدا کردن تفاوتها بین دو فایل استفاده میشود. این دستور به شما کمک میکند تا ببینید دقیقاً چه چیزی در دو نسخه از یک فایل تغییر کرده است.
اما استفاده از diff به تنهایی (بدون هیچ پرچمی) کمی سخت و نامفهوم است، چون خروجی آن بهصورت پیشفرض خیلی مختصر و بدون زمینه (context) است و ممکن است بهراحتی قابل درک نباشد.
💡 نکته: diff بهطور پیشفرض فقط خطهای متفاوت را نشان میدهد، بدون اینکه خطوط اطراف را هم ببینیم تا بفهمیم تغییر در چه بخشی از فایل رخ داده است.
برای اینکه خروجی diff را خواناتر و مفیدتر کنیم، از پرچم -u (مخفف unified) استفاده میکنیم:
$ diff -u file1.txt file2.txt
این دستور دو فایل را خطبهخط مقایسه میکند و خطهای متفاوت را در کنار هم (side-by-side) در یک خروجی یکپارچه نشان میدهد.
مزیت بزرگ diff -u این است که زمینه (context) بیشتری را نشان میدهد؛ یعنی چند خط قبل و بعد از تغییرات را هم میبینیم تا متوجه شویم تغییر دقیقاً در کجای فایل رخ داده است.
⚡ ترفند: همیشه از diff -u استفاده کن، چون خروجی آن بسیار واضحتر از diff معمولی است و درک تغییرات را آسانتر میکند.
بیایید با یک مثال ساده، کار با diff -u را تمرین کنیم. فرض کنید دو فایل داریم:
menu1.txt – منوی قدیمیmenu2.txt – منوی جدیدمحتوای menu1.txt (فایل اول):
Menu1:
Apples
Bananas
Oranges
Pears
محتوای menu2.txt (فایل دوم):
Menu:
Apples
Bananas
Oranges
Pears
همانطور که میبینی، تنها تفاوت این دو فایل این است که در فایل اول کلمه Menu1 نوشته شده، اما در فایل دوم کلمه Menu (بدون عدد ۱). حالا بیایید این دو فایل را با diff -u مقایسه کنیم:
$ diff -u menu1.txt menu2.txt
--- menu1.txt 2024-01-15 10:00:00.000000000 +0000
+++ menu2.txt 2024-01-15 10:05:00.000000000 +0000
@@ -1,5 +1,5 @@
-Menu1:
+Menu:
Apples
Bananas
Oranges
Pears
در خروجی میبینیم که:
-Menu1: یعنی این خط در فایل اول وجود داشته و حذف شده است.+Menu: یعنی این خط در فایل دوم اضافه شده است.✅ نتیجه: diff -u بهوضوح نشان میدهد که دقیقاً چه تغییری رخ داده و در کجای فایل است.
دستور patch ابزاری است که برای اعمال تغییرات (تفاوتها) روی فایل اصلی استفاده میشود. به این صورت که:
این دقیقاً همان کاری است که در درسنامههای قبلی انجام دادیم، اما حالا با یک مثال سادهتر آن را مرور میکنیم.
📌 نکته: patch به شما امکان میدهد تغییرات را بدون نیاز به ویرایش دستی فایل، بهصورت خودکار اعمال کنید.
بیایید یک مثال سادهتر را با هم مرور کنیم. دو فایل داریم:
hello_world.txt – نسخه سادهhello_world_long.txt – نسخه طولانیترمحتوای hello_world.txt (فایل اصلی):
Hello World
محتوای hello_world_long.txt (نسخه جدید):
Hello World
It's a wonderful day!
حالا بیایید با diff -u تفاوت را ببینیم و آن را در یک فایل .diff ذخیره کنیم:
$ diff -u hello_world.txt hello_world_long.txt > hello_world.diff
محتوای فایل hello_world.diff:
--- hello_world.txt 2019-12-16 19:24:12.556102821 +0900
+++ hello_world_long.txt 2019-12-16 19:24:38.944207773 +0900
@@ -1 +1,3 @@
Hello World
+It's a wonderful day!
همانطور که میبینی، خط +It's a wonderful day! نشان میدهد که یک خط جدید به فایل اضافه شده است.
حالا با استفاده از patch، این تغییر را روی فایل اصلی اعمال میکنیم:
$ patch hello_world.txt < hello_world.diff
patching file hello_world.txt
اگر حالا محتوای hello_world.txt را ببینیم، تغییرات اعمال شدهاند:
$ cat hello_world.txt
Hello World
It's a wonderful day!
یعنی با یک دستور ساده، فایل اصلی بهروزرسانی شد و به نسخه جدید تبدیل گردید.
🚀 نتیجه: با استفاده از diff و patch، میتوانیم تغییرات را بهراحتی و بدون خطا روی فایلهای خود اعمال کنیم.
دستورات diff و patch قابلیتهای بیشتری هم دارند که در این درسنامه به آنها نپرداختیم. برخی از این قابلیتها عبارتند از:
patch -p1 – برای حذف تعداد مشخصی از سطحهای مسیر (directory levels) هنگام اعمال patch روی پروژههای بزرگ.diff -r – برای مقایسه بازگشتی (recursive) دو پوشه (دایرکتوری) و پیدا کردن تفاوتهای بین تمام فایلهای داخل آنها.اگر میخواهید اطلاعات بیشتری درباره این دستورات و گزینههای پیشرفته آنها بدانید، میتوانید به صفحات راهنما (man pages) این دستورات مراجعه کنید:
💡 نکته: صفحات راهنما (man pages) یکی از بهترین منابع برای یادگیری دستورات لینوکس هستند و توضیحات کاملی درباره همه گزینههای یک دستور ارائه میدهند.
🎉 با اتمام این جلسه، با ابزارهای diff و patch بهخوبی آشنا شدید و میتوانید تفاوتها را پیدا کرده و تغییرات را اعمال کنید.