آموزش استفاده از دستور diff در لینوکس
کار با فایلها از ضروریات کار در سیستمهای لینوکس است. چه یک توسعه دهنده باشید یا یک مدیر سرور، باید بتوانید فایلها را (اغلب خط به خط) مقایسه کنید تا مغایرتها را یافته، عیب یابی نموده و یکپارچگی دادهها را تضمین نمائید. با استفاده از دستور diff در لینوکس میتوانید این کار را انجام دهید.
البته میتوانید سعی کنید فایلها را به صورت دستی هم مقایسه کنید، اما این یک کار خسته کننده و مستعد خطاهای انسانی است. به همین دلیل توصیه میکنیم از دستور diff استفاده نمائید، ابزاری موثر که این فرایند را آسانتر میکند. diff بخشی از بسته GNU Diffutils بوده و اغلب در تمام توزیعهای اصلی لینوکس در دسترس است.
در این آموزش نحوه مقایسه خط به خط فایلها را با استفاده از دستور diff در لینوکس توضیح داده و علاوه بر سینتکس اصلی، گزینههای دستوری حیاتی را پوشش خواهیم داد که میتوانید از آنها برای استفاده از دستور diff در اسکریپتهای خود و در خط فرمان استفاده نمائید.
مروری بر دستور diff در محیطهای لینوکس
diff مخفف کلمه difference (تفاوت) است. دستور diff یک ابزار منعطف است که اغلب در اکثر توزیعهای لینوکس از قبل نصب شده و میتوانید از این ابزار برای مقایسه محتوای دو فایل استفاده و تفاوتهای برجسته شده را برای مقایسه آسان مشاهده کنید. از نظر عملی، میتوانید از این دستور برای شناسایی اضافهها، حذفها و تغییرات در فایلها استفاده کنید.
این دستور میتواند تفاوت بین فایلها را با مقایسه خط به خط آنها نمایش دهد. با این حال، برخلاف دستورات مشابه مانند cmp و comm نشان میدهد که کدام خطوط در یک فایل باید تغییر کند تا دو فایل مشابه باشند.
سینتکس دستور diff
سینتکس اصلی diif به شرح زیر است:
# diff [option] file1 file2
هنگام استفاده از دستور diff، درک نحوه خواندن این خروجی بسیار مهم است:
- محتوای فایل اول با خروجی که با > شروع میشود ارجاع داده میشود.
- مواد موجود در فایل دوم با خروجی که با < شروع شده ارجاع داده میشود.
- شماره خطوط مربوط به فایل اول.
- یک نماد ویژه؛( فایل اول باید به روش خاصی تغییر کند تا با فایل دوم مطابقت داشته باشد)، همانطور که با نمادهای خاص نشان داده شده است. این نمادها عبارتند از:
- A (افزودن)
- C (ویرایش)
- D (حذف)
خرید سرور مجازی در پنج موقعیت جغرافیایی ایران، ترکیه، هلند، آلمان و آمریکا با قابلیت تحویل آنی در پارسدو فراهم است.
نحوه استفاده از دستور diff در لینوکس
مرحله 1: فایلهای نمونه را ایجاد کنید
ما با ایجاد دو فایل نمونه برای نشان دادن قابلیتهای دستور diff شروع میکنیم.
ترمینال را راه اندازی کنید و یک فایل متنی به نام rsfile1.txt در ویرایشگر متن دلخواه خود ایجاد کنید. برای ایجاد این فایل با استفاده از Nano دستور زیر را اجرا میکنیم:
# sudo nano pdfile1.txt
خطوط زیر را به فایل اضافه کنید:
Baran
Hamoon
Zand
Sina
Shahab
Dena
Aram
برای خروج از Ctrl + X استفاده کنید. Y را برای تایید ذخیره فایل فشار دهید.
سپس دستور زیر را اجرا کنید تا فایل دوم یعنی فایل rsfile2.txt ایجاد شود. مانند فایل قبلی، از دستور زیر برای ایجاد آن با استفاده از Nano استفاده میکنیم:
# sudo nano pdfile2.txt
خطوط زیر را به این فایل اضافه کنید:
Baran
Ario
Sina
Babak
Dena
فایل را ذخیره کرده و از ویرایشگر خارج شوید.
مرحله 2: از دستور diff برای مقایسه فایلها استفاده کنید
پس از تنظیم دو فایل نمونه، از دستور diff برای شناسایی تفاوتها و نحوه حذف این تفاوتها استفاده کنید:
# diff pdfile1.txt pdfile2.txt
خروجی شامل دستورالعملهای گام به گام در مورد نحوه تغییر محتوای فایل اول برای مطابقت با pdfile2.txt است.
گزینههای محبوب برای دستور diff لینوکس
هنگام استفاده بدون هیچ گزینهای، خروجی دستور diff تفاوت بین دو فایل را نشان میدهد. با این حال، میتوانید این رفتار پیش فرض را با گزینههای زیر تغییر دهید.
گزینه c-
میتوانید از گزینه c- برای فعال کردن context format برای خطوطی که در فایلها متفاوت هستند استفاده کنید.
برای مشاهده تفاوت فایلها در فرم متن از دستور زیر استفاده کنید:
# diff -c file1 file2
خروجی به شرح زیر است:
اول از همه، توجه داشته باشید که جزئیات مربوط به فایل اول با *** شروع و خطوطی که جزئیات مربوط به فایل دوم را نشان می دهند با - شروع میشوند.
نام فایل و تایم استمپ (Timestamp) هر دو فایل در دو خط اول نشان داده شده است:
*** pdfile1.txt 2024-03-17 12:18:55.233346039 +0330
--- pdfile2.txt 2024-03-17 12:20:31.505616413 +0330
تنها هدف *************** این است که به عنوان یک جداکننده بین دو بخش خروجی عمل کند.
بخش دوم خروجی با محدوده خط فایلها قبل از لیست کردن خطوط هر فایل شروع میشود:
*** 1,8 ****
--- 1,5 ----
محتوای فایلها در زیر head مناسب فهرست شده است. هر خط با دستورالعمل تغییر pdfile1.txt برای یکسان بودن با pdfile2.txt شروع میشود.
در ادامه توضیح مختصری از این دستورالعملها آمده است:
ورودیهای دارای علامت منفی (-) باید از فایل اصلی حذف شوند.
ورودیهای دارای علامت مثبت (+) باید به فایل اصلی اضافه شوند.
ورودی های دارای علامت تعجب (!) باید با خط منطبق از فایل دوم جایگزین شوند.
مهم: خطوط بدون علامت نباید ویرایش شوند.
گزینه u-
میتوانید قالب یکپارچه را برای نمایش خروجی به گونهای اعمال کنید که خطوط غیر ضروری را حذف کند. سینتکس این دستور به صورت زیر است:
# diff -u file1 file2
بیایید به خروجی دستور diff -u نگاه کنیم:
توجه داشته باشید که جزئیات مربوط به فایل اول با - شروع و خطوطی که جزئیات مربوط به فایل دوم را نشان میدهند با +++ شروع میشوند.
نام فایل و تایم استمپ (Timestamp) هر دو فایل در دو خط اول نشان داده شده است:
--- pdfile1.txt 2024-03-17 12:18:55.233346039 +0330
+++ pdfile2.txt 2024-03-17 12:20:31.505616413 +0330
خط @@ -1,8 +1,5 @@ محدوده خطوط را در فایلها نمایش میدهد.
محتویات فایلها در خطوط زیر به همراه دستورالعملهایی در مورد نحوه تغییر pdfile1.txt (فایل اول) دقیقا شبیه به pdfile2.txt (فایل دوم) نشان داده شده است.
نمادهای جلوی هر خط به چه معناست:
ورودیهای دارای علامت منفی (-) باید از فایل اول حذف شوند.
ورودیهای دارای علامت مثبت (+) باید به فایل اول اضافه شوند.
گزینه i-
به طور پیش فرض، دستور diff در محیطهای لینوکس به حروف کوچک و بزرگ حساس است. به این ترتیب، شامل تفاوتهای موردی در خروجی میشود. اگر میخواهید دستور این تفاوتها را نادیده بگیرد، از گزینه i استفاده کنید. سینتکس به شرح زیر است:
# diff -i file1 file2
خروجی تفاوتهای فایل را نشان میدهد و هنگامی که هیچ گزینه دیگری انتخاب نشده است، توصیههای اصلاحی را ارائه میدهد.
برای اینکه ایدهای از تاثیر گزینه i به شما ارائه دهیم، در اینجا مقایسه بدون آن به نظر می رسد:
گزینه version-
از دستور زیر استفاده کنید تا ببینید کدام نسخه از diff در سیستم شما فعال است:
# diff --version
معمولا بسته GNU Dissutils به محض اینکه نسخه پایدار جدیدی را ارائه دهند، در سیستم شما به روز میشود.
گزینه help-
در نهایت، میتوانید از گزینه help – برای دریافت کمک در مورد ابزار diff استفاده کنید. سینتکس به صورت زیر خواهد بود:
#diff --help
خروجی این سینتکس به صورت زیر خواهد بود:
گزینههای مهم دستور 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 را مفید میدانند زیرا راهی ساده و در عین حال قابل اعتماد برای تشخیص و مدیریت تغییرات محتوا ارائه میکند.