شما برای مطالعه این مقاله فقط 10 دقیقه وقت نیاز دارید

diff-command-in-linux
دسته بندی : آموزش لینوکس

دستور diff در لینوکس: آموزش کامل آپشن ها و مثال ها

5/5 - (1 امتیاز)

دستور diff در لینوکس مخفف difference است و همانطور که از اسم آن هم مشخص است این دستور برای برای مقایسه خط به خط فایل ها یا محتویات دایرکتوری ها و نشان دادن تفاوت های آنها استفاده می شود.

مقایسه فایل ها به صورت خط به خط برای انجام کارهایی مثل اشکال زدایی کدها، شناسایی تغییرات فایل های پیکربندی و اطمینان از یکی بودن محتویات فایل ها یا دایرکتوری ها خیلی مفید است که با دستور diff به راحتی می توانید از عهده آن بربیایید.

در صورت نیاز به یک سرور لینوکس حرفه ای با قدرت پردازشی بالا جهت اجرای انواع دستورات و پروژه ها می توانید به صفحه خرید سرور مجازی لینوکس ما سر بزنید.

پیش نیازهای استفاده از دستور diff در لینوکس

  • سرور لینوکس
  • دسترسی به ترمینال
  • دسترسی به یک کاربر با امتیازات sudo
  • نصب بودن diff در سیستم 

با اینکه دستور diff در اکثر توزیع های لینوکس به طور پیش فرض نصب است و می توانید مستقیماً از آن استفاده کنید ولی اگر متوجه شدید که سیستم شما مجهز به این ابزار نیست، باید ابتدا آن را نصب کنید.

دستور نصب diff در اوبونتو – دبیان

sudo apt install diffutils

دستور نصب diff در CentOS – فدورا

sudo yum install diffutils

یا

sudo dnf install diffutils

دستور نصب diff در آرچ لینوکس

sudo pacman -S diffutils

در آخر، با دستور زیر ورژن diff را چک کنید:

diff --version

با دیدن شماره نسخه diff می توانید از نصب موفقیت آمیز diff در لینوکس مطمئن شوید.

سینتکس دستور diff در لینوکس

سینتکس پایه دستور diff در لینوکس به صورت زیر است:

diff [Option] File1 File2

File1 و File2 همان دو فایلی هستند که میخواهید آنها را با هم مقایسه کنید ولی با استفاده از Option ها می توانید رفتار دستور diff را سفارشی سازی کنید.

آپشن های دستور diff

آپشنکاربرد
a-نمایش فایل ها به صورت متنی و مقایسه آنها به صورت خط به خط  
c-نمایش تفاوت دو فایل به صورت context
e-بررسی تفاوت دو فایل به صورت ed script
i-نادیده گرفتن تفاوت های Use case ( بزرگ یا کوچک بودن حروف)
w-نادیده گرفتن تفاوت های مربوط به فضای خالی
q-بررسی یکی بودن یا تفاوت داشتن دو فایل (بدون جزئیات)
r-مقایسه دایرکتوری ها به صورت بازگشتی
u-نمایش تفاوت دو فایل به صورت unified
y-نمایش تفاوت دو فایل به صورت side-by-side

اگر می خواهید با تمام آپشن های دستور diff آشنا شوید، می توانید از دستورات زیر استفاده کنید:

diff --version

man diff

فرمت خروجی دستور diff در لینوکس

خروجی دستور diff در 6 فرمت قابل ارائه است که در این بخش به بررسی آنها می پردازیم:

فرمت پیش فرض

اگر آپشن مربوط به نوع فرمت را در دستور diff مشخص نکنید، خروجی به صورت پیش فرض نمایش داده می شود که شبیه شکل زیر است:فرمت پیش فرض دستور diff در لینوکس

می بینید که با شماره ها، کاراکترها و نمادهای خاصی روبرو هستید که با هدف نمایش تفاوت ها در کنار هم قرار گرفته اند.

سمبل های موجود بین شماره خطوط، نشاندهنده نحوه ویرایش فایل اول برای یکی شدن آن با فایل دوم هستند:

a – اضافه کردن (add)

c – تعویض (change)

d – حذف (delete)

شماره خطوط موجود در سمت چپ سمبل مربوط به فایل اول هستند.

شماره خطوط موجود در سمت راست سمبل مربوط به فایل دوم هستند.

خطوط شروع شده با > به محتویات فایل اول اشاره دارند.

خطوط شروع شده با < به محتویات فایل دوم اشاره دارند.

حالا می خواهیم یک نمونه از این فرمت را بررسی کنیم:

0a1

خط ۱ از فایل دوم باید به خط ۰ از فایل اول اضافه شود.

Kubuntu <

همان خطی است که 0a1 از شما می خواهد به فایل اول اضافه کنید.

2d2

خط دوم فایل اول باید حذف شود.

اگر قصد حذف آن را ندارید، باید آن را به خط دوم فایل دوم اضافه کنید تا این هماهنگی برقرار شود.

 Arch Linux >

همان خطی است که طبق 2d2 باید حذف شود.

4c4,5

خط چهارم فایل اول باید با خط ۴ و ۵ فایل دوم جایگزین شود.

CentOS >

خط فایل اول که باید جایگزین شود.

نقش جداکننده را دارد.

 Arch Linux < و CentOS < 

خطوط مربوط به فایل دوم که باید با خط موردنظر از فایل اول تعویض شوند.

فرمت Context

این فرمت که با آپشن c نمایش داده می شود، تفاوت دو فایل را با زمینه ای از خطوط نشان می دهد که خروجی آن به شکل زیر است:فرمت کانتکست در دستور diff

این فرمت خروجی که با اسم فایل ها و تایم استمپ شروع می شود، بررسی تفاوت ها را با خطوط بعدی انجام می دهد.

*** به خطوط فایل اول اشاره دارد.

— به خطوط فایل دوم اشاره دارد.

خطوط Ubuntu ،Debian و Fedora در هر در فایل یکسان هستند و با دو فضای خالی که در ابتدای آنها قرار دارد، مشخص می شوند.

و اما می رسیم به سمبل های اصلی فرمت Context:

– خطوطی هستند که در فایل دوم وجود ندارند.

+ خطوطی هستند که در فایل اول وجود ندارند.

! خطوطی هستند که در هر دو فایل وجود دارند ولی باید تعویض شوند.

 Arch Linux – در خط دوم فایل اول وجود دارد ولی در خط دوم فایل دوم وجود ندارد.

 Kubuntu + با هیچ خطی از فایل اول مطابقت ندارند.

CentOS ! از فایل اول و CentOS ! و Arch Linux ! از فایل دوم باید تعویض شوند.

فرمت Unified

این فرمت، نسخه بهبود یافته فرمت Context است و خروجی نسبتاً کوتاه تری دارد.

خروجی این فرمت به صورت زیر است:فرمت unified

همانطور که جزئیات دو فایل تفکیک نشده اند و بررسی تفاوت ها و عملیات لازم برای مطابقت دو فایل در یک بخش بررسی شده اند:

خطوط شروع شده با دو فضای خالی، خطوطی هستند که در دو فایل یکسان هستند.

خطوط شروع شده با – ، همان خطوطی هستند که باید از فایل اول حذف شوند.

خطوط شروع شده با + ، همان خطوطی هستند که باید به فایل اول اضافه شوند.

فرمت Side by Side

این فرمت که با y نشان داده می شود، تفاوت های بین دو فایل را به صورت دو ستون کنار هم نمایش می دهد که مقایسه آنها را راحت تر می کند.

خروجی این فرمت به شکل زیر است:فرمت side by side

خطوطی که بدون هیچ علامتی با هم در یک ردیف قرار دارند، در هر دو فایل یکسان هستند.

خطوطی که بین آنها علامت | قرار دارد، خطوطی هستند که در دو فایل هم وجود دارند ولی محتویات آنها با هم کمی متفاوت است.

خطوطی که فقط در یک فایل وجود دارند با علامت > یا < نشان داده می شوند:

< به معنای این است که خط موردنظر در فایل اول وجود دارد ولی در فایل دوم نیست.

> به معنای این است که خط موردنظر در فایل دوم وجود دارد ولی در فایل اول نیست.

فرمت Brief

این فرمت که با q نشان داده می شود، فقط یک سری اطلاعات کلی را در مورد تفاوت های دو فایل نمایش می دهد.

خروجی این فرمت به شکل زیر است:فرمت brief

یعنی اگر دو فایل تفاوت داشته باشند، فرمت Brief این تفاوت را با جمله file1.txt and file2.txt differ یعنی دو فایل با هم تفاوت دارند به شما می گوید.

اگر هم یکسان باشد، فرمت Brief این را با جمله file1.txt and file2.txt are identical به شما اطلاع می دهد.

کلیک کنید  دستور journalctl در لینوکس برای بررسی لاگ های سیستم

این فرمت زمانی می تواند برای شما مفید باشد که نیازی به بررسی جزئیات تفاوت ها ندارید و فقط می خواهید بدانید که دو فایل یکی هستند یا نه.

فرمت Ed script

فرمت Ed script با آپشن e، یک اسکریپت تولید می کند که می توان آن را توسط ویرایشگر ed اجرا و تغییرات لازم برای یکی شدن دو فایل را اعمال کرد.

خروجی که توسط این فرمت ارائه می شود به شکل زیر است:فرمت ed script

3c نشان می دهد که که خط ۳ از فایل اول باید تغییر کند.

خط بعدی همان خط مربوط به فایل دوم است که خط سوم فایل اول باید با آن عوض شود.

. نشانه پایان تغییر است.

4a نشان می دهد که بعد از خط ۴ در فایل اول باید یک خط اضافه شود.

خط بعدی همان خط جدید مربوط به فایل دوم است که باید به فایل اول اضافه شود.

. نشانه پایان تغییر است.

اگر محتویات این خروجی را در یک اسکریپت با پسوند ed. ذخیره کنید و بعد آن را با دستور زیر اجرا کنید، تمام تغییرات در فایل اول اعمال می شوند:

 

ed file1.txt < diff_script.ed

 

به این ترتیب، فایل اول بر اساس اسکریپت ed آپدیت می شوند و دو فایل هم به یک شکل در می آیند. 

مثال های کاربردی از دستور diff لینوکس

دستور diff فرمت خروجی متفاوت تری دارد و برای اینکه متوجه تفاوت بین دو فایل شوید، باید نحوه تحلیل خروجی آن را یاد بگیرید که در این قسمت سعی می کنیم نحوه خواندن خروجی دستور diff را با مثال های کاربردی به شما آموزش دهیم.

* اگر از سرور مجازی لینوکس استفاده می کنید، طبق آموزش ورودی به سرور مجازی لینوکس، به سرور خود متصل شوید.

سپس، برای عملی کردن مثال ها دو فایل ایجاد می کنیم که خروجی مثال ها را بر اساس آنها بررسی کنیم:

sudo nano file1.txt

خطوط زیر را به آن اضافه کنید:

Apple

Orange

Banana

Watermelon

Cherry

کلید ترکیبی Ctrl + X را فشار دهید تا این فایل ذخیره کرده و از آن خارج شوید.

فایل دوم را هم ایجاد کنید:

sudo nano file2.txt

خطوط زیر را به آن اضافه کنید:

Orange

Peach

Apple

Banana

Melon

Cherry

کلید ترکیبی Ctrl + X را فشار دهید تا فایل دوم را هم ذخیره کرده و از آن خارج شوید.

یا اینکه به جای ایجاد فایل جدید، با دستور cd در مسیر فایل های موردنظر قرار بگیرید و مثال ها را روی این فایل ها اجرا کنید.

حالا نوبت به بررسی مثال های دستور diff در لینوکس می رسد.

بررسی تفاوت دو فایل به صورت نرمال

اگر در دستور diff هیچ آپشنی را لحاظ نکنید، مقایسه تفاوت های بین دو فایل به صورت پیش فرض انجام می شود.

diff file1.txt file2.txt

مثال فرمت پیش فرض

1d0 – خط اول از فایل اول باید حذف شود. وگرنه، باید در خط 0 ام فایل دوم ظاهر شود.

Apple > – همان محتویاتی است که طبق 1d0 باید حذف شود.

2a2,3 – بعد از خط دوم فایل اول، خطوط ۲ تا ۳ از فایل دوم اضافه شود.

Peach < و Apple < – همان محتویاتی هستند که باید به فایل اول اضافه شوند.

4c5 – خط چهارم فایل اول باید با خط پنجم فایل دوم جایگزین شوند.

Watermelon > و  Chery > – خط مربوط به فایل اول که باید عوض شود.

Watermelon < و Cherry > – خط مربوط به فایل دوم که باید خطوط موردنظر از فایل اول عوض شود.

بررسی تفاوت فایل با فرمت Context

برای این اینکه تفاوت های دو فایل را با فرمت کانتکست بررسی کنید، باید آپشن c را به دستور diff اضافه کنید.

diff -y file1.txt file2.txt

مثال فرمت context

*** نماد فایل اول است.

نماد فایل دوم است.

*** 1,5 **** و — 1,6 —- بازه خطوط دو فایل را نشان می دهد.

Orange و Banana در دو فایل یکسان هستند و نیازی به تغییر آنها نیست.

Apple باید از از فایل اول حذف شود.

Peach و Apple باید به فایل اول اضافه شوند.

Watermelon و Melon یکی هستند ولی محتویات آنها کمی با هم متفاوت است.

Cherry و Chery یکی هستند ولی محتویات آنها کمی با هم متفاوت است.

بررسی تفاوت های دو فایل به صورت unified

این فرمت شبیه فرمت Context است با این تفاوت که حالت کوتاه تر و خلاصه تری نسبت به آن دارد.

diff -u file1.txt file2.txt

مثال فرمت unified

@@ -1,5 +1,6 @@ بازه خطوط دو فایل را نشان می دهد.

Apple موجود در فایل اول باید حذف شود.

Orange بدون تغییر بماند.

Apple و Peach باید به فایل اول اضافه شوند.

Banana بدون تغییر بماند.

Watermelon و chery باید از فایل اول حذف شوند.

melon و cherry باید به فایل اول اضافه شوند.

مقایسه محتوای دو فایل به صورت side by side

این فرمت، مقایسه دو فایل را به صورت ستونی انجام می دهد که درک آن راحت تر است.

diff -u file1.txt file2.txt

مقایسه فرمت به صورت ساید بای ساید

Apple در فایل دوم وجود دارد ولی در فایل اول نیست.

Orange در هر دو فایل وجود دارد و نیازی به تغییر نیست.

Peach در فایل اول وجود دارد ولی در فایل دوم نیست.

Apple در فایل اول وجود دارد ولی در فایل دوم نیست.

Banana در هر دو فایل وجود دارد و نیازی به تغییر نیست.

Melon و Watermelon در هر دو فایل در ردیف یکسانی قرار دارند ولی محتویات آنها کمی متفاوت است.

chery و cherry در هر دو فایل در ردیف یکسانی قرار دارند ولی محتویات آنها کمی متفاوت است.

مقایسه دو فایل با فرمت Brief

این فرمت فقط متفاوت یا یکسان بودن محتویات دو فایل را بررسی می کند و هیچ جزئیات دیگری را ارائه نمی دهد.

diff -q file1.txt file2.txt

مثال فرمت Brief

مقایسه دو فایل با فرمت ed script

این فرمت علاوه بر مقایسه تفاوت دو فایل، امکان یکسان سازی دو فایل را هم به شما می دهد.

diff -e file1.txt file2.txt

مثال فرمت ed script

خط ۴ و ۵ از فایل اول باید با melon و cherry جایگزین شود.

Apple و Peach باید به بعد از خط ۲ فایل اول اضافه شوند.

خط اول فایل اول باید حذف شود.

حالا برای اعمال این تغییرات، می توانید خروجی این دستور را در یک فایل ذخیره کنید و سپس دستور زیر را اجرا کنید:

ed file1.txt < diff_script.ed

نادیده گرفتن اندازه حروف (Usecase) موقع بررسی تفاوت دو فایل

اگر اندازه حروف دو فایل برایتان مهم نیست و موقع بررسی تفاوت ها نمی خواهید اندازه حروف هم به عنوان تفاوت تلقی شود، کافیست i را به دستور اضافه کنید.

diff -i file1.txt file2.txt

نادیده گرفتن فضای خالی موجود در فایل ها موقع بررسی تفاوت دو فایل 

اگر تعداد یا موقعیت فضای خالی موجود در دو فایل اهمیتی ندارد و نمی خواهید آن ها هم به عنوان نشانه تفاوت حساب شوند، می توانید از آپشن w استفاده کنید.

diff -w file1.txt file2.txt

مقایسه محتویات دو دایرکتوری به صورت بازگشتی

diff -r directory1/ directory2/

این دستور تمام فایل های موجود در دایرکتوری ها را مقایسه می کند و به شما نشان می دهد که کدام فایل ها در دایرکتوری اول و کدام یک از آنها در دایرکتوری دوم وجود دارند.

حالا این شما هستید که می توانید فرمت ها و آپشن های مختلف دستور diff در لینوکس را امتحان کنید تا رفتار آن را به شکل دلخواه تنظیم کنید.

سخن آخر 

با دستور diff در لینوکس می توانید فایل ها و دایرکتوری ها را مقایسه کنید و تفاوت های آن را در فرمت های مختلف بررسی کنید. این دستور آپشن ها و فرمت های مختلفی را در اختیار شما قرار داده است تا مقایسه فایل ها را به شکل دلخواه انجام دهید.

مطالب مشابهی که شاید علاقمند باشید

من زهرا پیرجانی دانشجوی رشته نرم افزار هستم. علاقه ای که به یادگیری مطالب جدید دارم باعث شد که انگیزم برای فعالیت در حوزه تولیدمحتوا بیشتر شود. تمام تلاشم این است که با درک کامل موضوع، محتوایی ساده و کامل تهیه کنم که برای همه علاقمندان مفید و کاربردی باشد. یادگیری مطالب جدید و آموزش اونها به بقیه، بهترین کاری هست که می توانم برای رشد خودم و همچنین کمک به رشد علاقمندان به مباحث مورنظر انجام بدم.

دیدگاه های شما

برای دریافت این مقاله لطفا ایمیلتان را وارد کنید

می توانید مقاله را دانلود کنید یا پرینت بگیرید