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

کار با فایل‌ها از ضروریات کار در سیستم‌های لینوکس است. چه یک توسعه دهنده باشید یا یک مدیر سرور، باید بتوانید فایل‌ها را (اغلب خط به خط) مقایسه کنید تا مغایر‌ت‌ها را یافته، عیب یابی نموده و یکپارچگی داده‌ها را تضمین نمائید. با استفاده از دستور diff در لینوکس می‌توانید این کار را انجام دهید.

البته می‌توانید سعی کنید فایل‌ها را به صورت دستی هم مقایسه کنید، اما این یک کار خسته کننده و مستعد خطاهای انسانی است. به همین دلیل توصیه می‌کنیم از دستور diff استفاده نمائید، ابزاری موثر که این فرایند را آسان‌تر می‌کند. diff بخشی از بسته GNU Diffutils بوده و اغلب در تمام توزیع‌های اصلی لینوکس در دسترس است.

در این آموزش نحوه مقایسه خط به خط فایل‌ها را با استفاده از دستور diff در لینوکس توضیح داده و  علاوه بر سینتکس اصلی، گزینه‌های دستوری حیاتی را پوشش خواهیم داد که می‌توانید از آنها برای استفاده از دستور diff در اسکریپت‌های خود و در خط فرمان استفاده نمائید.

مروری بر دستور diff در محیط‌های لینوکس

diff مخفف کلمه difference (تفاوت) است. دستور diff یک ابزار منعطف است که اغلب در اکثر توزیع‌های لینوکس از قبل نصب شده و می‌توانید از این ابزار برای مقایسه محتوای دو فایل استفاده و تفاوت‌های برجسته شده را برای مقایسه آسان مشاهده کنید. از نظر عملی، می‌توانید از این دستور برای شناسایی اضافه‌ها، حذف‌ها و تغییرات در فایل‌ها استفاده کنید.

این دستور می‌تواند تفاوت بین فایل‌ها را با مقایسه خط به خط آنها نمایش دهد. با این حال، برخلاف دستورات مشابه مانند cmp و comm نشان می‌دهد که کدام خطوط در یک فایل باید تغییر کند تا دو فایل مشابه باشند.

نکته :  توجه کنید که diff برای تغییر فایل اول برای مطابقت با فایل دوم استفاده می‌شود.

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

سینتکس اصلی diif به شرح زیر است:

هنگام استفاده از دستور diff، درک نحوه خواندن این خروجی بسیار مهم است:

  • محتوای فایل اول با خروجی که با > شروع میشود ارجاع داده می‌شود.
  • مواد موجود در فایل دوم با خروجی که با < شروع شده ارجاع داده می‌شود.
  • شماره خطوط مربوط به فایل اول.
  • یک نماد ویژه؛( فایل اول باید به روش خاصی تغییر کند تا با فایل دوم مطابقت داشته باشد)، همانطور که با نمادهای خاص نشان داده شده است. این نمادها عبارتند از:
  1. A (افزودن)
  2. C (ویرایش)
  3. D (حذف)

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

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

 

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

ما با ایجاد دو فایل نمونه برای نشان دادن قابلیت‌های دستور diff شروع می‌کنیم.

ترمینال را راه اندازی کنید و یک فایل متنی به نام rsfile1.txt در ویرایشگر متن دلخواه خود ایجاد کنید. برای ایجاد این فایل با استفاده از Nano دستور زیر را اجرا می‌کنیم:

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

برای خروج از Ctrl + X استفاده کنید.  Y  را برای تایید ذخیره فایل فشار دهید.
سپس دستور زیر را اجرا کنید تا فایل دوم یعنی فایل rsfile2.txt ایجاد شود. مانند فایل قبلی، از دستور زیر برای ایجاد آن با استفاده از Nano استفاده می‌کنیم:

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

 

فایل را ذخیره کرده و از ویرایشگر خارج شوید.

مرحله 2: از دستور diff برای مقایسه فایل‌ها استفاده کنید

پس از تنظیم دو فایل نمونه، از دستور diff برای شناسایی تفاوت‌ها و نحوه حذف این تفاوت‌ها استفاده کنید:

خروجی شامل دستورالعمل‌های گام به گام در مورد نحوه تغییر محتوای فایل اول برای مطابقت با pdfile2.txt است.

 

گزینه‌های محبوب برای دستور diff لینوکس

هنگام استفاده بدون هیچ گزینه‌ای، خروجی دستور diff تفاوت بین دو فایل را نشان می‌دهد. با این حال، می‌توانید این رفتار پیش فرض را با گزینه‌های زیر تغییر دهید.

گزینه c-

می‌توانید از گزینه c- برای فعال کردن context format برای خطوطی که در فایل‌ها متفاوت هستند استفاده کنید.

برای مشاهده تفاوت فایل‌ها در فرم متن از دستور زیر استفاده کنید:

خروجی به شرح زیر است:

اول از همه، توجه داشته باشید که جزئیات مربوط به فایل اول با *** شروع  و خطوطی که جزئیات مربوط به فایل دوم را نشان می دهند با – شروع می‌شوند.

نام فایل و تایم استمپ (Timestamp) هر دو فایل در دو خط اول نشان داده شده است:

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

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

محتوای فایل‌ها در زیر head مناسب فهرست شده است. هر خط با دستورالعمل تغییر pdfile1.txt برای یکسان بودن با pdfile2.txt شروع می‌شود.

در ادامه توضیح مختصری از این دستورالعمل‌ها آمده است:

ورودی‌های دارای علامت منفی (-) باید از فایل اصلی حذف شوند.

ورودی‌های دارای علامت مثبت (+) باید به فایل اصلی اضافه شوند.

ورودی های دارای علامت تعجب (!) باید با خط منطبق از فایل دوم جایگزین شوند.

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

گزینه u-

می‌توانید قالب یکپارچه را برای نمایش خروجی به گونه‌ای اعمال کنید که خطوط غیر ضروری را حذف کند. سینتکس این دستور به صورت زیر است:

بیایید به خروجی دستور diff -u نگاه کنیم:

 

توجه داشته باشید که جزئیات مربوط به فایل اول با – شروع و خطوطی که جزئیات مربوط به فایل دوم را نشان می‌دهند با +++ شروع می‌شوند.

نام فایل و تایم استمپ (Timestamp) هر دو فایل در دو خط اول نشان داده شده است:

 

خط @@ -1,8 +1,5 @@ محدوده خطوط را در فایل‌ها نمایش می‌دهد.

محتویات فایل‌ها در خطوط زیر به همراه دستورالعمل‌هایی در مورد نحوه تغییر pdfile1.txt (فایل اول) دقیقا شبیه به pdfile2.txt (فایل دوم) نشان داده شده است.

نمادهای جلوی هر خط به چه معناست:
ورودی‌های دارای علامت منفی (-) باید از فایل اول حذف شوند.
ورودی‌های دارای علامت مثبت (+) باید به فایل اول اضافه شوند.

گزینه i-

به طور پیش فرض، دستور diff در محیط‌های لینوکس به حروف کوچک و بزرگ حساس است. به این ترتیب، شامل تفاوت‌های موردی در خروجی می‌شود. اگر می‌خواهید دستور این تفاوت‌ها را نادیده بگیرد، از گزینه i استفاده کنید. سینتکس به شرح زیر است:

خروجی تفاوت‌های فایل را نشان می‌دهد و هنگامی که هیچ گزینه دیگری انتخاب نشده است، توصیه‌های اصلاحی را ارائه می‌دهد.

برای اینکه ایده‌ای از تاثیر گزینه i به شما ارائه دهیم، در اینجا مقایسه بدون آن به نظر می رسد:

گزینه version-

از دستور زیر استفاده کنید تا ببینید کدام نسخه از diff در سیستم شما فعال است:

معمولا بسته GNU Dissutils به محض اینکه نسخه پایدار جدیدی را ارائه دهند، در سیستم شما به روز می‌شود.

گزینه  help-

در نهایت، می‌توانید از گزینه help – برای دریافت کمک در مورد ابزار diff استفاده کنید. سینتکس به صورت زیر خواهد بود:

خروجی این سینتکس به صورت زیر خواهد بود:

گزینه‌های مهم دستور diff

ما گزینه های زیر را برای استفاده با دستور diff توصیه می کنیم:

توضیحات دستور
فایل‌ها را به صورت متن باز و خط به خط مقایسه کنید -a / –text
هنگامی که فایل‌ها را با هم مقایسه می‌کنید، فضاهای سفید را نادیده بگیرید -b / –ignore-space-change
هنگام مقایسه فایل‌ها، خطوط خالی را نادیده بگیرید -B
نوشتن و مقایسه داده‌ها در فرمت باینری –binary
الگوریتم را تنظیم کنید (مثلا برای شناسایی مجموعه‌ای کوچکتر از تغییرات) -d–minimal
ایجاد و خروجی اسکریپت ویرایش واقعی -e / –ed
هنگام مقایسه فایل‌ها، انتهای برگه را نادیده بگیرید -E / –ignore-tab-expansion
برای صفحه بندی خروجی، آن را از طریق pr اجرا کنید -l / –paginate
  اگر فایلی وجود ندارد، آن را به عنوان موجود اما خالی در نظر بگیرید -N / –new-file
ارائه تفاوت در فایل‌ها بدون جزئیات -q / brief
نتیجه زمانی که هر دو فایل یکسان هستند -s / –report-identical-files
فضای سفید را از مقایسه فایل‌ها حذف کنید -w / –ignore-all-space

جمع‌بندی

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