جستجو برای:
سبد خرید 0
  • صفحه اصلی
  • دوره‌های آموزشی
  • وبلاگ
  • درباره ما
  • قوانین و مقررات
  • همکاری با ما
  • تماس با ما
محتوای باز
ورود
[suncode_otp_login_form]
گذرواژه خود را فراموش کرده اید؟
عضویت
[suncode_otp_registration_form]
  • خانه
  • کتاب آنلاین
  • درباره سایت
  • درباره لوگو
  • تماس با ما
محتوای باز
  • صفحه اصلی
  • دوره‌های آموزشی
  • وبلاگ
  • درباره ما
  • قوانین و مقررات
  • همکاری با ما
  • تماس با ما
شروع کنید
آخرین اطلاعیه ها
لطفا برای نمایش اطلاعیه ها وارد شوید
0
[wcas-search-form]

مقایسه متون (Comparing Text)

16 آذر 1399
ارسال شده توسط فرشید نوتاش حقیقت
خط فرمان، گنو/لینوکس
مقایسه متون

در مقایسه با فرمان sort، فرمان uniq بسیار ساده‌تر است. فرمان uniq در ظاهر وظیفه کم‌اهمیتی را انجام می‌دهد، اما درواقع این‌گونه نیست.

زمانی‌که فایل مرتب شده‌ای را در اختیار دارید، فرمان uniq خطوط اضافی را حذف کرده و نتیجه را برای ارسال به خروجی استاندارد ارسال می‌کند. درواقع این کار نیز، نوعی از مرتب‌سازی است، با این تفاوت که فقط خطوط اضافی نمایش داده نمی‌شوند. فرمان uniq معمولا در کنار sort به‌کار می‌رود، تا نتایج sort را پاک‌سازی کند.

در ادامه یک فایل تمرینی، به‌صورت زیر ایجاد می‌کنیم:

[me@linuxbox ~]$ cat > foo.txt
a
b
c
a
b
c

به یاد داشته باشید که از Ctrl+D به‌منظور تخریب خروجی استاندارد و پایان فایل استفاده می‌کنیم. اگر که فرمان uniq را بر روی فایل اجرا کنیم، نتایج هیچ تفاوتی با نسخه اصلی فایل نخواهند کرد و کاراکترهای اضافی حذف نخواهند شد:

[me@linuxbox ~]$ uniq foo.txt
a
b
c
a
b
c

دلیل آن، این است که برای آن‌که فرمان uniq بتواند وظیفه خود را انجام دهد، باید در ابتدا، ورودی مرتب‌سازی شود:

[me@linuxbox ~]$ sort foo.txt | uniq
a
b
c

دلیل آن هم این است که در فرمان uniq فقط موارد اضافی که مجاور یکدیگر هستند را حذف می‌کند. فرمان uniq دارای چندین گزینه است که در جدول زیر لیست موارد رایج نشان داده شده است:

گزینهتوضیحات
-cخروجی یک لیست از خطوط تکرار به همراه نوشتن تعداد دفعات تکرار شده قبل از خط
-dخروجی فقط تعداد خطوط تکرار به جای خطوط یگانه
-f nنادیده گرفتن n فیلد ورودی در هر خط. فیلدها با فاصله از هم جدا می‌شوند. هرچند برخلاف uniq، sort دارای هیچ گزینه‌ای برای تنظیم جداکننده فیلد ندارد.
-iنادیده گرفتن بزرگی و کوچکی حروف در مقایسه در خط
-s nنادیده گرفتن کاراکترهای مقدم n از هر خط
-uخروجی فقط خطوط یگانه. این گزینه پیشفرض است.

در این‌جا می‌بینیم که فرمان uniq با به‌کار بردن گزینه –c به‌منظور گزارش تعداد موارد تکرار شده در داخل فایل متنی استفاده شده است:

[me@linuxbox ~]$ sort foo.txt | uniq -c
2 a
2 b
2 c

فرمان cut (حذف بخش‌هایی از هر خط فایل)

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

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

گزینهتوضیح
-c char_listاستخراج بخشی از خط که با char_list تعریف شده است. لیست ممکن است حاوی یک یا چند محدوده عددی جدا شده با کاما باشد.
-f field_listاستخراج یک یا چند فیلد از خط به صورتیکه با field_list تعریف شده است. یست ممکن است حاوی یک یا چند فیلد یا محدوده‌ای از فیلدها که با کاما جدا شده‌اند، باشد.
-d delim_charوقتیکه -f تعیین می‌گردد، از delim_char به عنوان کاراکتر جداکننده استفاده کنید. بصورت پیش فرض فیلدها بایستی یا یک کاراکتر تب جدا شوند.
--complementاستخراج کل خطوط متن به جز آن بخش‌هایی که با -c و یا -f تعیین شده‌اند.

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

نگاهی به فایل distros.txt خواهیم انداخت تا ببینیم که آیا به اندازه کافی برای مثال‌های ما مناسب خواهد بود یا نه. در ادامه، با استفاده از فرمان cat به‌همراه گزینه –A محتویات distros.txt را می‌بینیم:

[me@linuxbox ~]$ cat -A distros.txt
SUSE^I10.2^I12/07/2006$
Fedora^I10^I11/25/2008$
SUSE^I11.0^I06/19/2008$
Ubuntu^I8.04^I04/24/2008$
Fedora^I8^I11/08/2007$
SUSE^I10.3^I10/04/2007$
Ubuntu^I6.10^I10/26/2006$
Fedora^I7^I05/31/2007$
Ubuntu^I7.10^I10/18/2007$
Ubuntu^I7.04^I04/19/2007$
SUSE^I10.1^I05/11/2006$
Fedora^I6^I10/24/2006$
Fedora^I9^I05/13/2008$
Ubuntu^I6.06^I06/01/2006$
Ubuntu^I8.10^I10/30/2008$
Fedora^I5^I03/20/2006$

به نظر خوب است؛ هیچ فضای اضافی وجود ندارد، تنها کاراکترهای Tab بین هر فیلد، وجود دارد تا فیلدها را جدا کند. از آن‌جایی که فایل به‌جای فاصله از کاراکتر Tab استفاده می‌کند، از گزینه –f برا استخراج فیلدها استفاده خواهیم کرد:

[me@linuxbox ~]$ cut -f 3 distros.txt
12/07/2006
11/25/2008
06/19/2008
04/24/2008
11/08/2007
10/04/2007
10/26/2006
05/31/2007
10/18/2007
04/19/2007
05/11/2006
10/24/2006
05/13/2008
06/01/2006
10/30/2008
03/20/2006

به این دلیل که فایل distros با کاراکتر Tab جدا شده است، بهتر است که از فرمان cut به‌منظور استخراج فیلدها به‌جای استخراج کاراکترها استفاده کنیم. دلیلش هم این است که زمانی‌که یک فایل با Tab جدا شده، بعید است که هر خط دارای همان تعداد کاراکتر باشد که در نتیجه، محاسبه موقعیت کاراکترها را دشوار و یا حتی غیرممکن می‌سازد. هرچند در مثال بالا، فیلدی را استخراج می‌کنیم که احتمالا دارای اندازه داده‌ای یکسانی است، پس می‌توانیم استخراج کاراکتر را با استخراج سال از هر خط انجام دهیم:

[me@linuxbox ~]$ cut -f 3 distros.txt | cut -c 7-10
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
2006
2008
2006
2008
2006

با اجرای فرمان cut برای بار دوم بر روی لیست خود، می‌توانیم کاراکترهایی که در موقعیت کاراکتری 7 تا 10 هستند که همان فیلد سال را شامل می‌شود، استخراج کنیم.

زمانی‌که با فیلدها کار می‌کنیم ممکن است که یک جداکننده فیلد متفاوت را به‌جای کاراکتر Tab استفاده کنیم. مثال فایل passwd را به یاد بیاورید که با کاراکتر (:) از هم جدا می‌شد:

[me@linuxbox ~]$ cut -d ':' -f 1 /etc/passwd | head
root
daemon
bin
sys
sync
games
man
lp
mail
news

با استفاده از گزینه –d قادر هستیم که کاراکتر دونقطه را به‌عنوان جداکننده فیلد، استفاده کنیم.

فرمان paste (ادغام خطوطی از فایل‌ها)

فرمان paste مخالف فرمان cut عمل می‌کند. به‌جای این‌که ستونی از متن یک فایل را استخراج کند، یک یا چند ستون از متن را به یک فایل اضافه می‌کند. این کار را از طریق خواندن چندین فایل و ترکیب فیلدهای پیدا شده در هر فایل در یک جریان در خروجی استاندارد انجام می‌دهد. مشابه فرمان cut، فرمان paste نیز چندین آرگومان فایل را قبول می‌کند، برای نشان دادن این‌که paste چگونه عمل می‌کند، بایستی کمی فایل distros.txt را تغییر دهیم تا یک لیست تقویمی از ریلیزهای توزیع‌ها ایجاد کنیم.

از کار اخیر خودف با استفاده از sort ابتدا لیستی از توزیع‌های مرتب شده را بر اساس تاریخ ایجاد می‌کنیم و نتایج را در یک فایل با نام distros-by-date.txt ذخیره می‌کنیم:

[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt > distros-bydate.
txt
[me@linuxbox ~]$ cut -f 1,2 distros-by-date.txt > distros-versions.txt
[me@linuxbox ~]$ head distros-versions.txt
Fedora 10
Ubuntu 8.10
SUSE 11.0
Fedora 9
Ubuntu 8.04
Fedora 8
Ubuntu 7.10
SUSE 10.3
Fedora 7
Ubuntu 7.04

آخرین بخش از آماده‌سازی، استخراج تاریخ‌های انتشار و ذخیره آن‌ها در فایلی با نام distros-daste.txt می‌باشد:

[me@linuxbox ~]$ cut -f 3 distros-by-date.txt > distros-dates.txt
[me@linuxbox ~]$ head distros-dates.txt
11/25/2008
10/30/2008
06/19/2008
05/13/2008
04/24/2008
11/08/2007
10/18/2007
10/04/2007
05/31/2007
04/19/2007

اکنون بخش‌هایی که نیاز داریم را فراهم نمودیم. برای کامل کردن پروسه، با استفاده از فرمان paste ستون‌های تاریخ، نام توزیع‌ها و نسخه‌ها را کنار هم قرار داده و یک لیست تقویمی ایجاد می‌کنیم. این کار به‌سادگی با استفاده از فرمان paste و آرگومان‌هایی به ترتیب مورد نظر صورت می‌پذیرد:

[me@linuxbox ~]$ paste distros-dates.txt distros-versions.txt
11/25/2008 Fedora 10
10/30/2008 Ubuntu 8.10
06/19/2008 SUSE 11.0
05/13/2008 Fedora 9
04/24/2008 Ubuntu 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10
10/04/2007 SUSE 10.3
05/31/2007 Fedora 7
04/19/2007 Ubuntu 7.04
12/07/2006 SUSE 10.2
10/26/2006 Ubuntu 6.10
10/24/2006 Fedora 6
06/01/2006 Ubuntu 6.06
05/11/2006 SUSE 10.1
03/20/2006 Fedora 5

فرمان join (اتصال خطوط دو فایل بر روی یک فیلد رایج)

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

برای مشاهده این‌که چگونه عملیات join در یک پایگاه‌داده رابطه‌ای انجام می‌شود، یک پایگاه‌داده بسیار کوچک شامل دو جدول را فرض کنید که هر کدام از این جداول دارای یک رکورد هستند. جدول اول CUSTOMERS به‌معنای مشتریان، دارای سه فیلد است: شماره مشتری (CUSTNUM)، نام مشتری (FNAME) و نام خانوادگی مشتری (LNAME).

CUSTNUM FNAME LNAME
========= ====== ======
4681934 John Smith

 

جدول دوم ORDERS به معنای سفارشات، شامل چهار فیلد شماره سفارش (ORDERNUM)، شماره مشتری (CUSTNUM)، کیفیت (QUAN) و ترتیب آیتم‌ها (ITEM) است:

ORDERNUM CUSTNUM QUAN ITEM
========== ========= ===== ====
3014953305 4681934 1 Blue Widget

مشاهده می‌شود که هر دو جدول دارای فیلد مشترکی با نام CUSTNUM هستند. این نکته بسیار مهم است؛ چرا که موجب ایجاد رابطه بین جداول می‌شود.

انجام یک عملیات join به ما این اجازه را می‌دهد تا فیلدها را در دو جدول با هم ترکیب کنیم تا نتایج دلخواهی مثل ارائه فاکتور، به‌دست آید.

با استفاده از مقادیر مطابق در فیلدهای CUSTNUM در هر دو جدول، یک عملیات join قادر است، لیست زیر را ایجاد نماید:

FNAME LNAME QUAN ITEM
====== ====== ===== ====
John Smith 1 Blue Widget

برای شرح فرمان join، نیاز است فایل‌هایی ایجاد شوند که دارای یک کلید اشتراکی باشند. بدین منظور، از فایل distros-by-date.txt استفاده خواهیم کرد. از این فایل، دو فایل جانبی ایجاد می‌کنیم. اولی حاوی تاریخ‌های انتشار (که فیلد اشتراکی ما برای این آزمون است) و نام‌های انتشار:

[me@linuxbox ~]$ cut -f 1,1 distros-by-date.txt > distros-names.txt
[me@linuxbox ~]$ paste distros-dates.txt distros-names.txt > distros-key-names
.txt
[me@linuxbox ~]$ head distros-key-names.txt
11/25/2008 Fedora
10/30/2008 Ubuntu
06/19/2008 SUSE
05/13/2008 Fedora
04/24/2008 Ubuntu
11/08/2007 Fedora
10/18/2007 Ubuntu
10/04/2007 SUSE
05/31/2007 Fedora
04/19/2007 Ubuntu

و دیگری شامل تاریخ‌های انتشار و شماره‌های نسخه:

[me@linuxbox ~]$ cut -f 2,2 distros-by-date.txt > distros-vernums.txt
[me@linuxbox ~]$ paste distros-dates.txt distros-vernums.txt > distros-keyvernums.
txt
[me@linuxbox ~]$ head distros-key-vernums.txt
11/25/2008 10
10/30/2008 8.10
06/19/2008 11.0
05/13/2008 9
04/24/2008 8.04
11/08/2007 8
10/18/2007 7.10
10/04/2007 10.3
05/31/2007 7
04/19/2007 7.04

اکنون دو فایل داریم که یک کلید اشتراکی (تاریخ‌های انتشار) دارند. لازم به ذکر است که برای انجام عملیات join فایل‌ها بایستی ابتدا بر اساس کلید اشتراکی مرتب شوند.

[me@linuxbox ~]$ join distros-key-names.txt distros-key-vernums.txt | head
11/25/2008 Fedora 10
10/30/2008 Ubuntu 8.10
06/19/2008 SUSE 11.0
05/13/2008 Fedora 9
04/24/2008 Ubuntu 8.04
11/08/2007 Fedora 8
10/18/2007 Ubuntu 7.10
10/04/2007 SUSE 10.3
05/31/2007 Fedora 7
04/19/2007 Ubuntu 7.04

مقایسه متون (Comparing Text)

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

فرمان comm (مقایسه بین دو فایل مرتب‌شده به‌صورت خط به خط)

فرمان comm دو فایل متنی را با یکدیگر مقایسه می‌کند و خطوط یگانه هر یک و خطوط مشترک را نمایش می‌دهد. به‌منظور توضیح مطلب، دو فایل متنی تقریبا یکسان با استفاده از فرمان cat ایجاد می‌کنیم:

[me@linuxbox ~]$ cat > file1.txt
a
b
c
d
[me@linuxbox ~]$ cat > file2.txt
b
c
d
e

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

[me@linuxbox ~]$ comm file1.txt file2.txt
a
b
c
d
e

همان‌گونه که مشاهده می‌کنید، فرمان comm سه ستون را در خروجی ایجاد می‌کند. اولین فرمان حاوی خطوط یگانه نسبت به فایل اول در آرگومان است. ستون دوم خطوط یگانه نسبت به فایل دوم در آرگومان است. ستون سوم خطوط مشترک بین هر دو فایل می‌باشد. فرمان comm از گزینه‌های –n پشتیبانی می‌کند که به‌جای آن اعداد 1 و 2 و 3  قرار می‌گیرند که این گزینه‌ها تعیین می‌کند تا چه ستون‌هایی سرکوب شوند. برای مثال اگر بخواهیم که در خروجی فقط خطوط اشتراکی را بین هر دو فایل را مشاهده کنیم، با به‌کار بردن گزینه -12 ستون‌های 1 و 2 را از نتایج حذف می‌کنیم:

[me@linuxbox ~]$ comm -12 file1.txt file2.txt
b
c
d

فرمان diff (مقایسه فایل‌ها به‌صورت خط به خط)

فرمان diff نیز مانند فرمان comm، به‌منظور تشخیص تفاوت‌های بین فایل‌ها مورد استفاده قرار می‌گیرند. هر چند که فرمان diff ابزاری کاملا پیچیده‌تری است و فرمت‌های خروجی زیادی را پشتیبانی می‌کند و قادر به پردازش مجموعه فایل‌های بزگ‌تر به‌صورت یک‌جا می‌باشد.

فرمان diff اغلب توسط توسه‌دهندگان نرم‌افزار به‌منظور آزمون تغییرات بین نسخه‌های مختلف کد نرم‌افزاری استفاده می‌شود. به این دلیل که این فرمان توانایی آزمون دایرکتوری‌های کد را به‌صورت بازگشتی دارد. استفاده رایجی از فرمان diff ایجاد فایل‌های diff یا Patchهایی است که توسط برنامه‌هایی مانند patch استفاده می‌شوند تا نسخه‌ای از فایل را به نسخه‌ای دیگر تبدیل کنند.

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

یک توضیح جزئی از تفاوت‌های بین دو فایل:

[me@linuxbox ~]$ diff file1.txt file2.txt
1d0
< a
4a4
> e

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

تغییرتوضیحات
r1ar2اضافه کردن خطوط در موقعیت r2 در فایل دوم به موقعیت r1 در فایل اول
r1cr2تغییر (جایگزینی) خطوط در موقعیت r1 با خطوط در موقعیت r2 در فایل دوم
r1dr2حذف خطوط در فایل اول در موقعیت r1، که در محدوده r2 در فایل دوم نمایان شده است.

با وجود این‌که این فرمت پیش‌فرض است ولی مانند سایر فرمت‌های اختیاری به‌صورت گسترده استفاده نمی‌شود. دو مورد از دیگر فرمت‌های رایج، فرمت‌های context format و unified format هستند.

وقتی که با استفاده از فرمت context format (گزینه –c) نمایش می‌دهیم، خروجی به شکل زیر است:

[me@linuxbox ~]$ diff -c file1.txt file2.txt
*** file1.txt 2012-12-23 06:40:13.000000000 -0500
--- file2.txt 2012-12-23 06:40:34.000000000 -0500
***************
*** 1,4 ****
- a
b
c
d
--- 1,4 ----
b
c
d
+ e

خروجی با نام و فایل و برچسب زمانی آغاز می‌گردد. فایل اول با ستاره‌هایی نشانه‌گذاری شده و فایل دوم با کاراکترهای (–) نشانه‌گذاری شده است.

سپس گروهی از تغییرات را مشاهده می‌کنید، مثلا شماره پیش‌فرض که خط‌های متن را دربرگرفته است. در گروه اول *** 1,4 **** را مشاهده می‌کنیم که نشان‌دهنده خط یک تا خط چهار در فایل اول است. سپس — 1,4 —- را می‌بینیم که نشان‌دهنده خط اول تا خط چهار در فایل دوم است. در بین یک گروه خطوط با نشان‌گرهایی آغاز می‌شوند، مثلا – و + که در جدول زیر لیست شده و معنای آن شرح داده شده است:

شاخصمفهوم
(none)یک خط نشان داده شده است برای زمینه. این نشان‌دهنده تفاوت بین دو فایل نیست.
-یک خط حذف شده. این خط در فایل اول نمایش داده خواهد شد ولی در فایل دوم نمایش داده نخواهد شد.
+یک خط اضافه شده. این خط در فایل دوم نمایش داده می‌شود ولی در فایل اول نمایش داده نمی‌شود.
!یک خط تغییر یافته. دو نسخه از خط نمایش داده خواهد شد، هر کدام در بخش مربوطه گروه تغییر

فرمتunified  نیز مشابه فرمتcontext  بوده؛ با این تفاوت که خلاصه‌تر می‌باشد. این فرمت را با گزینه –u نمایش می‌دهیم:

[me@linuxbox ~]$ diff -u file1.txt file2.txt
--- file1.txt 2012-12-23 06:40:13.000000000 -0500
+++ file2.txt 2012-12-23 06:40:34.000000000 -0500
@@ -1,4 +1,4 @@
-a
b
c
d
+e

آشکارترین تفاوت میان دو فرمت context و unified در حذف خطوط تکراری متن است که موجب می‌شود فرمت unified بسیار خلاصه‌تر باشد. در این مثال، برچسب‌های زمانی مانند قبل قابل مشاهده بوده و در ادامه رشته @@ -1,4 +1,4 @@ را مشاهده می‌نمایید.

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

هر خطی که با یک کاراکتر آغاز شده، معنای خاصی دارد که در جدول زیر نمایش داده شده است:

کاراکترمفهوم
(none)این خط توسط هر دو فایل به اشتراک گذاشته شده.
-این خط از فایل اول حذف شده است.
+این خط به فایل اول اضافه شده است.

فرمان patch (اعمال diff به یک فایل اصلی)

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

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

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

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

مسلما فرمان‌های diff/patch بر روی هر فایل متنی، نه‌تنها بر روی کد منبع کار می‌کنند. این تغییرات را می‌توان به‌صورت برابر بر روی فایل‌های پیکربندی و دیگر فایل‌های متنی نیز اعمال کرد. برای فراهم آوردن یک فایل diff برای استفاده با patch توصیه می‌شود، این‌گونه کنید:

diff -Naur old_file new_file > diff_file

در اینجا old_file و new_file هر دو فایل‌ها یا پوشه‌هایی حاوی فایل‌ها هستند. گزینه –r بازگشت به یک دایرکتوری درختی را پشتیبانی می‌کند.

زمانی که فایل diff ایجاد شد، می‌توانیم آن را اعمال کنیم تا فایل قدیمی را به فایل جدید patch کنیم:

patch < diff_file

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

[me@linuxbox ~]$ diff -Naur file1.txt file2.txt > patchfile.txt
[me@linuxbox ~]$ patch < patchfile.txt
patching file file1.txt
[me@linuxbox ~]$ cat file1.txt
b
c
d
e

در این مثال یک فایل diff با نام patchfile.txt ایجاد و سپس از برنامه patch برای اعمال patch استفاده کردیم.

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

همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرم‌افزارهای آزاد/ متن‌باز و سیستم‌عامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.

نوشته‌های بیشتر از فرشید نوتاش حقیقت
قبلی روش‌های دسترسی به خط انتقال
بعدی ویرایش بر روی هوا (Editing on the Fly)

دیدگاهتان را بنویسید لغو پاسخ

این سایت از اکیسمت برای کاهش جفنگ استفاده می‌کند. درباره چگونگی پردازش داده‌های دیدگاه خود بیشتر بدانید.

جستجو
جستجو برای:
دسته‌بندی موضوعی مقالات
  • برنامه‌نویسی
    • پایتون
    • دواپس
  • پایگاه‌داده
    • MariaDB
    • MySQL
  • تجارت الکترونیک
    • بازاریابی اینترنتی
    • دیجیتال مارکتینگ
    • شبکه‌های اجتماعی
  • جامعه کاربری
    • لاگ
  • دسته‌بندی نشده
  • شبکه و امنیت
  • طراحی وب
    • سئو
    • سیستم مدیریت محتوا
      • وردپرس
  • فناوری‌های نوظهور
    • اینترنت اشیاء
    • رایانش ابری
      • OpenStack
    • کلان‌داده‌ها
  • گنو/لینوکس
    • توزیع
      • CentOS
      • اوبونتو
      • دبیان
      • فدورا
    • چیست
    • خط فرمان
  • مهاجرت به آزاد/متن‌باز
  • نرم‌افزار
    • اداری
      • لیبره آفیس
        • ایمپرس
        • بیس
        • دراو
        • رایتر
        • کالک
    • کاربردی
    • گرافیک و انیمیشن
      • بلندر
      • گیمپ
نماد الکترونیکی (اینماد)
پرداخت‌یار

محتوای باز؛ مرجع آموزشی نرم‌افزارهای آزاد/ متن‌باز

از اینکه قصد همکاری با رسانه «محتوای باز» را دارید بسیار خرسندیم و این مایه مباهات ماست.

نحوه همکاری با ما چندان پیچیده نیست و شرایط آن در ادامه، ارائه گردیده است.

دستمزد مدرسین

پیش از بیان شرایط ضبط ویدئو شایان ذکر است اشاره‌ای به دستمزد مدرسین سایت داشته باشیم.

شما ممکن است در دو حالت تمایل به نشر ویدئو خود را داشته باشید: یا آن را رایگان در اختیار عموم قرار دهید و یا اینکه در قبال فروش آن از خریدار وجه مربوطه محصول را اخذ نمایید.

صرف نظر از هر حالت ممکنه، می‌بایست شرایطی که در ادامه ذکر شده‌اند را رعایت کرده باشید.

در حالت اول (رایگان) رسانه محتوای باز (Open Content)، نه وجهی از شما برای نشر ویدئو می‌گیرد و نه وجهی به شما پرداخت می‌نماید و دوره آموزشی شما را به رایگان منتشر می‌کند.

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

شرایط کلی ضبط دوره آموزشی

دوره آموزشی مربوطه، صرف نظر از هر محتوایی که دارد می‌بایست در یکی از توزیعات گنو/لینوکسی ضبط شده باشد. (به‌عنوان مثال دوره دروپال در اوبونتو، دوره آموزشی کار با آردوینو در دبیان و امثالهم). اگر دوره آموزشی شما در محیط ویندوز و یا هر پلتفرم/سیستم‌عامل دیگری ضبط شده باشد از همکاری با شما معذوریم.

پیشنهاد می‌گردد برای ضبط دوره آموزشی در توزیع گنو/لینوکس از ابزار قدرتمند OBS استفاده نمایید. البته این صرفا یک پیشنهاد است و شما می‌توانید از هر ابزار مناسب دیگری برای این کار بهره ببرید.

برای آشنایی یا تسلط بیشتر می‌توانید دوره رایگان آموزش OBS محمد عابدینی را ببینید:

مشاهده دوره آموزش OBS
شرایط کیفی ضبط دوره آموزشی

کیفیت صدا از اهمیت ویژه‌ای برخوردار می‌باشد و می‌بایست فاقد هر گونه نویز یا صدای اضافی دیگری (صدای محیط پیرامون) باشد.

دوره آموزشی تهیه شده صرفا باید برای رسانه محتوای باز تدوین شده باشد و در هیچ سایت مشابه دیگری قرار نگرفته باشد.

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

دوره آموزشی ضبط شده می‌باید فاقد هر گونه لوگو یا آدرس سایت دیگری (در گوشه تصویر یا بک‌گراند صفحه دسکتاپ و هر جای دیگری) باشد.

در حین دوره، مدرس نباید به برند خاصی اشاره کند که جز رقبای ما به‌شمار می‌آیند.

مدرس باید در ابتدا در اواسط و در انتهای دوره به برند ما یعنی رسانه محتوای باز (Open Content) بصورت کلامی اشاره نماید.

مدرس، هنگام تدریس نباید تپق زده، سرفه یا عطسه کند یا صدای قورت دادن بزاقش شنیده شود و بایستی با صدای رسا، دوستانه و پرانرژی به تدریس بپردازد.

قبل از تدوین دوره آموزشی حتما با ما در تماس باشید و یک ویدیوی چنددقیقه‌ای (ترجیحا 5 الی 10 دقیقه)، بصورت نمونه‌کار برای ما بفرستید.

از همکاری با شما سپاسگزاریم.

فراخوان همکاری