رتبه موضوع:
  • 3 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش خط فرمان لینوکس
#1
توی این تاپیک قصد دارم دستورات خط فرمان لینوکس رو برای کسانی که به تازگی با دنیای نرم افزارهای آزاد آشنا شدن یا قصد دارن از انحصار مایکروسافت بیان بیرون آموزش بدم. بخش عمده ای از مطالب این تاپیک از کتاب The Linux Command Line - A Complete Introduction نوشته آقای William E. Shotts Jr. گرفته شده ولی هرجا احساس کردم مطلب گنگ هست، تجربه شخصی و مطالب سایر منابع رو هم بهش اضافه کردم. با ما همراه باشین.
#2
میخوام براتون یه قصه بگم. نه، قصه اینکه چطور در سال 1991، لینوس توروالدز اولین نسخه از هسته لینوکس رو نوشت رو نمیخوام بگم. میتونید این قصه رو توی خیلی از کتابهای لینوکس بخونید. قصه اینکه چطور چند سال قبل، ریچارد استالمن پروژه GNU (بخونید گِنو) رو شروع کرد تا یک سیستم عامل آزاد مبتنی بر یونیکس بسازه رو هم نمیخوام بگم. اینم قصه مهمیه ولی خیلی کتابهای دیگه درمورد لینوکس به این قصه هم پرداختن. نه، من میخوام قصه اینکه چطور میتونید کنترل کامپیوترتون رو دوباره در دست بگیرین، صحبت کنم.

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

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

مردم زیادی با احترام درباره «آزادی» وقتی اسم لینوکس میاد، حرف میزنن، ولی فکر نمیکنم خیلی از مردم بدونن این آزادی واقعاً چه معنایی داره. آزادی، قدرت تصمیم گیری درمورد اینه که کامپیوتر شما چه کاری باید انجام بده، و تنها راهی که بشه به این آزادی رسید اینه که بدونید همین الآن، کامپیوترتون داره چیکار میکنه. آزادی، یک کامپیوتره که هیچ رازی پشت پرده نداره، کامپیوتری که هر چیزی رو بتونید درموردش بفهمین، فقط به این شرط که براتون اهمیت داشته باشه.
#3
چرا از خط فرمان استفاده کنیم؟


تا بحال فیلمهایی رو دیدین که یک سوپر هکر (همون آدمی که میتونه به کامپیوتر فوق محرمانه نظامی در کمتر از 30 ثانیه نفوذ کنه)، میشینه پشت یه کامپیوتر و اصلاً به ماوس دست نمیزنه؟ این موضوع بخاطر اینه که فیلمسازها فهمیدن که ما آدما، ناخودآگاه قبول کردیم که تنها راهی که واقعاً بشه کارها رو روی کامپیوتر انجام بدیم، تایپ کردنشون با کیبورده.

اکثر کاربران کامپیوتر امروزی با رابط گرافیکی کاربر (GUI) آشنا هستن و این ذهنیت به اونها توسط سازندگان کامپیوتر القا شده که رابط خط فرمان (CLI) یه چیز ترسناک متعلق به گذشته است. این موضوع مایه تأسفه، چون یک رابط خط فرمان خوب، بطرز شگفت آوری یک راه مناسب و توصیفی برای برقراری ارتباط با کامپیوتر، به همون شکلی هست که کلمات گفتاری خودمون رو روی کاغذ مینویسیم. درواقع میشه GUI رو به مکالمه و CLI رو به مکاتبه تشبیه کرد و همه میدونیم که خیلی حرفها رو تو نامه میشه بهتر و راحتتر گفت. گفته میشه: «رابط گرافیکی کاربر باعث میشه کارهای آسون، آسون انجام بشن، درحالی که رابط خط فرمان باعث میشه کارهای سخت، ممکن بشن» و این موضوع، امروزه همچنان صحت داره.

از اونجایی که لینوکس بعد از خانواده Unix در سیستمهای عامل طراحی شده، خط فرمان بسیار قدرتمند اون رو به ارث برده. Unix به شکل قابل کاربرد، در اوایل دهه 1980 ساخته شد (هرچند اولین بار یک دهه قبل درست شده بود)، قبل از اینکه رابط گرافیکی کاربر اینهمه محبوب بشه و درنتیجه، بجای رابط گرافیکی غنی، یک خط فرمان فوق العاده قدرتمند داخل خودش داشت. درحقیقت، یکی از مهمترین دلایلی که کاربران امروزی لینوکس تصمیم میگیرن بجای ویندوز ازش استفاده کنن، رابط خط فرمان قدرتمند لینوکس محسوب میشه که باعث میشه «کارهای سخت، ممکن بشه».
#4
توی این آموزش قراره درباره چی حرف بزنیم؟

این آموزش یک دید کلی از «زندگی» توی خط فرمان لینوکس به شما میده. برخلاف برخی از آموزشها که روی یک برنامه خاص متمرکز میشن (مثل برنامه shell یا همون bash)، این آموزش سعی میکنه به شما تجربه حسی عمیقتری از رابط خط فرمان بده. چطور کار میکنه؟ چه کارهایی میتونه انجام بده؟ بهترین روش استفاده از اون چیه؟

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

این آموزش روی لینوکس متمرکز شده. خیلی از آموزشهای دیگه هستن که سعی میکنن شعاع تمایلشون رو با دربر گرفتن بسترهای دیگه مثل Unix عمومی یا Max OS X و... گسترش بدن. با این کار، اونها باعث میشن محتواشون فقط به مباحث عمومی و مشترک محدود بشه. درمقابل، این آموزش فقط توزیعهای مختلف لینوکس رو شامل میشه. 95٪ محتوای این آموزش برای کاربران سایر سیستمهای مبتنی بر Unix مناسب و کاربردیه ولی این آموزش هدفش فقط تبدیل شما به یک کاربر پیشرفته و امروزی خط فرمان لینوکسه.
#5
چه کسانی باید این آموزش رو بخونن؟

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

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

درمقابل، یادگیری خط فرمان لینوکس به شدت همراه با جایزه است! اگه فکر میکنین الان یه «کاربر حرفه ای» هستین، فقط صبر کنین. هنوز نمیدونید قدرت واقعی یعنی چی. و برخلاف خیلی از مهارتهای کامپیوتر، دانش خط فرمان چون دستوراتش زیاد تغییر نمیکنه، تا مدتها براتون کاربردی هست و فراموش نمیشه. مهارتهایی که امروز یاد میگیرین، 10 سال دیگه هم بدردتون میخوره. خط فرمان از آزمون زمان زنده بیرون اومده!

ضمناً فرض میکنیم که شما هیچ تجربه برنامه نویسی ندارین. نگران نشین، خیلی زود به سطح مهارتهای زیاد برمیگردیم.
#6
شِل چیه؟

وقتی درمورد خط فرمان حرف میزنیم، در اصل داریم به Shell اشاره میکنیم. شل (پوسته) یه برنامه است که دستورات صفحه کلید رو میگیره و اونها رو به سیستم عامل میده تا انجام بده. تقریباً تمام توزیعهای لینوکس یه برنامه شل از پروژه GNU به اسم bash رو همراه خودشون دارن. bash مخفف Bourne Again Shell هست که بیانگر این حقیقته که bash یک نسخه توسعه یافته و جایگزین شده sh یعنی برنامه شل اصلی Unix هست که توسط Steve Bourne نوشته شده.

شبیه سازهای ترمینال

وقتی از یه رابط گرافیکی کاربر استفاده میکنیم، نیاز به یه برنامه دیگه داریم به اسم «شبیه ساز ترمینال» (Terminal Emulator) تا بتونیم با شل کار کنیم. اگه توی منوهای سیستمتون بگردین، حتماً یکیشونو پیداش میکنید. کاربران KDE از konsole استفاده میکنن و کاربران GNOME از gnome-terminal که میشه به شکل خلاصه، ternimal صداش زد. شبیه سازهای دیگری هم برای لینوکس وجود دارن همه اونها یه کار مشترک انجام میدن: به ما اجازه میدن به شل دسترسی پیدا کنیم. ممکنه شما یکیشون رو بخاطر یکسری امکانات جانی که داره، به بقیه ترجیح بدین ولی در کل، همه اونها کار اصلی که گفتیم رو انجام میدن.

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

خوب بگذارین شروع کنیم. شبیه سازی ترمینال رو اجرا کنید. وقتی اجرا شد، یه چیزی شبیه این میبینید:
[me@ncis-ir ~]$

به این، «اعلان شل» (Shell Prompt) میگن و هروقت شل آماده دریافت ورودی از شما باشه، ظاهر میشه. با اینکه برحسب توزیع لینوکس ازنظر ظاهر ممکنه تفاوتهای توش وجود داشته باشه، معمولاً شامل username@machinename و بعد، مسیر کاری فعلی (بعداً درباره اش بیشتر توضیح میدیم) و یه علامت دلار هست.

اگه آخرین کارکتر اعلان، بجای دلار، علامت هش بود (#) ترمینال توی وضعیت superuser هست. این به معنای لاگین شدن بعنوان کاربر root (ریشه) یا استفاده از ترمینالی هست که به ما اجازه دسترسی به مجوزهای superuser (مدیر سیستم) رو میده.

فرض میکنیم همه چیز تا الان خوب پیش رفته. بگذارین یکم تایپ کنیم. یه چیز الکی تایپ کنید مثل این:
[me@ncis-ir ~]$ kaekfjaeifj

از اونجایی که این دستور معنا نداره، شل بهمون میگه که این دستور رو پیدا نکرده و یه شانس دوباره به ما میده:
bash: kaekfjaeif: command not found
[me@ncis-ir ~]$

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

حرکت مکان نما

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

کمی توضیح درباره ماوس و تمرکز

با اینکه شل فقط با کیبورد سروکار داره، ولی میتونید از ماوس هم توی شبیه ساز ترمینالتون استفاده کنید. مکانیزمی که داخل سیستم X Window هست (موتور پشت پرده ای که GUI لینوکس رو میسازه) از یک تکنیک کپی و الصاق سریع پشتیبانی میکنه. اگه متنی رو با نگه داشتن دکمه چپ ماوس و کشیدنش انتخاب کنید (یا روی یک کلمه دوبار کلیک کنید)، توی بافر X (کلیپ بورد) کپی میشه. فشاردادن دکمه وسط ماوس متن رو جایی که مکان نما قرار داره الصاق میکنه. امتحانش کنید.

سعی نکنید از کلیدهای Ctrl+C و Ctrl+V برای کپی و الصاق استفاده کنید چون کار نمیکنه. توی شل، این کنترلها معنای دیگری نسبت به اون چیزی که سالها ویندوز برای اونها درنظر گرفته بود، دارن.

محیط گرافیکی دسکتاپ شما (مثل KDE یا GNOME) در تلاش برای رفتار مشابه ویندوز، ممکنه سیاست تمرکز اون رو تقلید کرده باشن. این به معنای اونه که برای اینکه یک پنجره مورد تمرکز باشه (فعال بشه) باید روش کلیک کنید. البته این با رفتار سنتی X که میگه تمرکز دنبال ماوس میاد فرق میکنه که میگه یه پنجره وقتی ماوس روش قرار میگیره فعال میشه. البته پنجره تا وقتی که روش کلیک نکنید، جلو نمیاد ولی قادر به دریافت ورودی خواهد بود. تنظیم کردن سیاست تمرکز روی «تمرکز به دنبال ماوس» کارکردن با پنجره های ترمینال رو راحتتر میکنه. امتحانش کنید. فکر میکنم اگه بهش یه شانس بدین، اون رو به روش ویندوز ترجیح بدین. تنظیمات مربوط به این کار رو توی برنامه تنظیمات مدیر پنجره خودتون میتونید پیدا کنید.
#7
چند دستور ساده رو امتحان کنید


حالا که یاد گرفتیم تایپ کنیم، اجازه بدین چند دستور ساده رو امتحان کنیم. اولین دستور date هست. این دستور زمان و تاریخ جاری رو نشون میده:
[me@ncis-ir ~]$ date
Tue Jun 16 01:47:11 IRDT 2015

یکی از دستورات مرتبط، cal هست که بطور پیشفرض، تقویم ماه جاری رو نشون میده:
[me@ncis-ir ~]$ cal
     June 2015        
Su Mo Tu We Th Fr Sa  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30            

اگه میخواین بدونین چقدر فضای خالی روی درایوهای هارد دیسکتون دارین، دستور df رو بنویسید:
[me@ncis-ir ~]$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       14317616 9052392   4514888  67% /
none                   4       0         4   0% /sys/fs/cgroup
udev             1014056       4   1014052   1% /dev
tmpfs             204972     900    204072   1% /run
none                5120       0      5120   0% /run/lock
none             1024848      88   1024760   1% /run/shm
none              102400      32    102368   1% /run/user

اگه خواستین بفهمین چقدر RAM خالی دارین از دستور free استفاده کنید:
[me@ncis-ir ~]$ free
             total       used       free     shared    buffers     cached
Mem:       2049696     757848    1291848       7968      67008     311708
-/+ buffers/cache:     379132    1670564
Swap:      2095100          0    2095100

خاتمه دادن به جلسه ترمینال
میتونیم جلسه ترمینالی که باز کردن رو با بستن پنجره شبیه ساز ترمینال یا واردکردن دستور exit جلوی اعلان شل خاتمه بدیم:
[me@ncis-ir ~]$ exit

نقل قول:کنسول پشت پرده
حتی اگه هیچ پنجره ترمینالی درحال اجرا نباشه، جلسات ترمینال متعددی پشت پرده دسکتاپ گرافیکی شما توی لینوکس درحال اجرا باقی هستن که بهشون ترمینالهای مجازی یا کنسولهای مجازی میگن. این جلسات میتونن در اکثر توزیعهای لینوکس با کلیدهای CTRL+ALT+F1 تا CTRL+ALT+F6 فراخوانی بشن. وقتی وارد یه جلسه شدین، باید لاگین کنید که میتونید از نام کاربری و رمز عبور خودتون استفاده کنید. برای رفتن از یه کنسول مجازی به یکی دیگه، کلید ALT و F1 تا F6 رو بزنید. برای برگشتن به دسکتاپ گرافیکی کلید ALT+F7 رو بزنید.
#8
حرکت داخل سیستم فایل

اولین چیزی که نیاز لازمه یاد بگیریم (درکنار تایپ کردن)، نحوه حرکت توی سیستم فایل لینوکس هست. توی این قسمت دستورات زیر رو معرفی میکنیم:
  • pwd : مخفف Print working directory هست و مسیر کاری فعلی رو نمایش میده (الان توی چه مسیری هستیم)
  • cd : مخفف Change directory هست و میتونیم باهاش مسیری که داخلش هستیم رو عوض کنیم
  • ls : مخفف List Segment هست و محتوای مسیر فعلی رو نشون میده
نقل قول:یادآوری: اوایل که سیستم یونیکس اومد، از یه مفهومی به اسم Segment بجای File استفاده میکرد که مفهومشون کاملاً مشابه بود و برای همین اسم این دستور بجای lf شد ls

درک درخت سیستم فایل

مشابه ویندوز، یک سیستم شبه یونیکس مثل لینوکس فایلهاش رو داخل چیزی که بهش میگیم «ساختار سلسله مراتبی پوشه ها» نگهداری میکنه. معناش اینه که یه ساختار درختی برای مسیرها (پوشه ها) وجود داره که توی اون، هر پوشه میتونه شامل یکسری فایل یا پوشه دیگه باشه و پوشه های داخل یک پوشه، پوشه های فرعی اون محسوب میشن. اولین پوشه توی سیستم فایل به اسم ریشه (root) شناخته میشه. خود پوشه root شامل یکسری فایل و پوشه های دیگه است که هرکدوم به نوبه خودشون فایلها و پوشه های دیگه ای دارن.

دقت کنید که برخلاف ویندوز که یک سیستم فایل جدا برای هر دیسک یا درایو داره، سیستمهای شبه یونیکس مثل لینوکس کلاً یک سیستم فایل دارن و مهم نیست چندتا درایو یا دیسک به سیستم وصل کرده باشین. دیسکهای مختلف میتونن براساس نظر مدیر سیستم، در نقاط مختلفی روی درخت  وصل (یا بطور دقیقتر سوار - Mount) بشن یا برحسب نظر مدیر سیستم، اونها رو جدا (پیاده - Unmount) کرد.

مسیر کاری فعلی

اغلب ما با یک مدیر فایل گرافیکی که درخت سیستم فایل رو نشون میده از قبل آشنایی داریم. شکل زیر رو ببینید:

   

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

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

تصور کنید که سیستم فایل شبیه یه درخت سر و ته شده است (ریشه درخت، بالاست) و ما میتونیم هرجایی وسط این درخت و در بین شاخه های اون وایستیم. در هر زمان ما توی یکی از شاخه ها هستیم و فقط میتونیم شاخه های فرعی و برگهای همون شاخه که توشیم رو ببینیم. تنها راه رفتن به یه شاخه دیگه (که جزو شاخه های فرعی شاخه فعلی ما نیست) هم اینه که اینقدر به شاخه والد شاخه فعلی بریم (برگردیم بالا) که به یه شاخه برسیم که والد شاخه موردنظرمون هم هست (اون شاخه که میخوایم بهش بریم، زیرمجموعه شاخه ای هست که بهش رسیدیم). البته شاید بعضی وقتا لازم باشه تا خود ریشه هم بالا بریم. اون شاخه ای که الان داخلش هستیم رو بهش میگن مسیر کاری فعلی (Current working directory) و با دستور pwd میتونید ببینیم چیه:
[me@ncis-ir ~]$ pwd
/home/me

وقتی که اولین بار وارد سیستم میشیم یا یک پنجره ترمینال جدید باز میکنیم، مسیر کاری ما، پوشه خانه (Home) کاربر جاری هست. هر حساب کاربری توی لینوکس یک پوشه خانگی شخصی داره که تنها جاییه که وقتی بعنوان یک کاربر معمولی داره از سیستم استفاده میکنه، مجاز به نوشتن روی فایلها و پوشه های داخلشه (البته میشه حق دسترسی به فایلهای دلخواه دیگه رو هم توسط مدیر سیستم یا کاربری که مالک اون فایلهاست بهش بدیم ولی فعلاً مدنظر ما نیست و بعداً درموردش توضیح میدیم).

نمایش محتوای یک پوشه

برای نمایش فایلها و پوشه های داخل مسیر کاری فعلی، از دستور ls استفاده میکنیم:
[me@ncis-ir ~]$ ls
Applications  Documents  Music     Public  Templates  ZS Workspace
Desktop       Downloads  Pictures  Shared  Videos

البته ممکنه نتیجه شما با مثال بالا یکی نباشه چون فایلهای شما فرق میکنه. درحقیقت، ما میتونیم از ls برای فهرست کردن محتوای هر پوشه ای (نه فقط پوشه کاری فعلی) استفاده کنیم و این دستور میتونه کارهای خیلی جالب بیشتری هم انجام بده. توی جلسات بعدی وقت بیشتری رو صرف ls میکنیم.

تغییر پوشه کاری فعلی

برای تعییر پوشه کاری فعلیتون (جایی که الان روی درخت ایستادین) باید از دستور cd استفاده کنید. جلوی دستور cd باید مسیری که میخواین به اونها حرکت کنید رو بنویسید. مسیرها رو میشه به دو شکل مشخص کرد: مطلق یا نسبی. خوب اول بیاین بریم سراغ مسیرهای مطلق

مسیرهای مطلق

یک مسیر مطلق از ریشه شروع میشه و شاخه به شاخه میاد جلو تا برسه به پوشه یا فایل موردنظر. برای مثال، پوشه ای توی سیستم شما هست که اغلب برنامه های شما اونجا نصب شده. مسیر این پوشه usr/bin/ هست. این معناش اینه که از ریشه (همون / اول مسیر) یه پوشه وجود داره به اسم usr که حاوی یه پوشه دیگه به اسم bin هست:
[me@ncis-ir ~]$ cd /usr/bin
[me@ncis-ir bin]$ pwd
/ust/bin
[me@ncis-ir bin]$ ls
... Listing of many, many files ...

حالا میتونید ببینید که مسیر کاری فعلی رو به usr/bin/ تغییر دادیم و این مسیر پر از کلی فایله. به خطوط 2 و 4 دقت کردین که چطور بعد از تغییر مسیر کاری فعلی، اعلان شل عوض شد؟ برای راحتی کار شما، معمولاً سیستم لینوکس طوری تنظیم شده که بطور خودکار اسم آخرین پوشه از مسیر کاری فعلی رو نشون بده.

مسیرهای نسبی

وقتی مسیرهای مطلق از ریشه شروع میشن و به مقصد میرسن، مسیرهای نسبی از مسیر کاری فعلی شروع میشن. برای این کار، یکسری علامتهای خاص برای نمایش مسیرهای نسبی توی درخت سیستم فایل تعریف شده. این علامتهای ویژه . (dot) و .. (dot dot) هستن.

علامت . به مسیر کاری فعلی و علامت .. به پوشه والدش اشاره میکنه. برای اینکه بهتر متوجه بشین، بگذارین برگردیم توی مسیر usr/bin/ :
[me@ncis-ir ~]$ cd /usr/bin
[me@ncis-ir bin]$ pwd
/usr/bin

خوب حالا میخوایم برگردیم به پوشه والد usr/bin/ که میشه usr/ و اگه بخوایم با مسیر مطلق بریم، باید اینطوری بنویسیم:
[me@ncis-ir bin]$ cd /usr
[me@ncis-ir usr]$ pwd
/usr

یا با مسیر نسبی:
[me@ncis-ir bin]$ cd ..
[me@ncis-ir usr]$ pwd
/usr

دو روش بالا نتایج یکسانی تولید میکنن. از کدوم باید استفاده کنیم؟ اونی که تایپ کمتری لازم داره!

به همین شکل برای اینکه از مسیر usr/ به usr/bin/ بریم، باز هم دو راه داریم. یکی مسیر مطلق:
[me@ncis-ir usr]$ cd /usr/bin
[me@ncis-ir bin]$ pwd
/usr/bin

و یکی مسیر نسبی:
[me@ncis-ir usr]$ cd ./bin
[me@ncis-ir bin]$ pwd
/usr/bin

خوب حالا یه نکته مهم رو باید بگم. تقریباً در تمام موارد، میتونید از /. چشمپوشی کنید چون بطور ضمنی درنظر گرفته میشه. تایپ کردن دستور زیر:
[me@ncis-ir usr]$ cd bin

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

چند میانبر مفید

رفتن به پوشه Home کاربری که الان توی سیستم وارد شده:
cd
cd ~

رفتن به پوشه قبلی که توش بودیم:
cd -

رفتن به پوشه Home هر کاربر دلخواه:
cd ~me

نکته: بجای me اسم کاربر موردنظر رو بنویسید.

یکسری نکات مهم درباره اسامی فایلها
  • فایلهایی که اسم اونها با نقطه شروع بشه، فایلهای مخفی به حساب میان. این فقط معناش اینه که ls اونها رو نشون نمیده، مگه اینکه بصورت ls -a صداش بزنید. وقتی که اکانت شما ساخته شده، چند فایل مخفی توی پوشه خانه شما ایجاد شدن تا تنظیمات اکانت شما رو نگهداره کنن. بعداً نگاه دقیقتری به برخی از این فایلها میندازیم تا ببینیم چطور میتونید محیط کاری خودتون رو سفارشی کنید. بعلاوه، برخی از برنامه ها، فایلهای تنظیمات و پیکربندی خودشون رو توی پوشه Home شما بصورت فایلهای مخفی نگهداری میکنن.
  • فایلها و دستورات در لینوکس (مثل یونیکس) به بزرگی و کوچکی حروف حساس هستن. اسامی File1 و file1 به دو فایل متفاوت اشاره میکنن.
  • لینوکس مفهومی تحت عنوان پسوند فایل نداره. شما میتونید فایلهاتون رو هرجور دوست دارین نامگذاری کنین. محتوا و/یا هدف یک فایل به روشهای دیگری تشخیص داده میشه. هرچند سیستمهای شبه یونیکس از پسوندها برای تشخیص محتوا و هدف فایلها استفاده نمیکنن، اما برخی از برنامه هایی که توی این سیستمها کار میکنن ممکنه این کار رو انجام بدن.
  • اگرچه لینوکس از اسامی فایل طولانی که شامل فاصله و علائم نگارشی هستن پشتیبانی میکنه، اما بهتره کارکترهای نگارشی رو محدود به نقطه، خط تیره - و خط زیر _ کنید. از همه مهمتر، فاصله توی اسامی نگذارین. قراردادن فاصله توی اسامی باعث میشه که تایپ خیلی از دستورات سخت بشه (درموردش توی جلسات آینده بیشتر حرف میزنیم). اگه میخواین کلمات رو توی اسم فایل از هم جدا کنید، از خط زیر _ بجای فاصله استفاده کنید. بعداً از خودتون بخاطر اینکار تشکر میکنید.
تشکر شده توسط: __undercover , YN97 , mahdirabbani , fatima-php , farazsahebdel , majidganji
#9
کاوش در سیستم
حالا که فهمیدیم چطور توی سیستم فایل حرکت کنیم، وقتشه تور آموزشی خودمون رو توی سیستم لینوکس شروع کنیم. قبل از شروع، میخوایم چند تای دیگه از دستوراتی که میتونن توی مسیر برامون مفید باشن رو یاد بگیریم:
  • ls فهرست محتوای پوشه
  • file تشخیص نوع فایل
  • less نمایش محتوای فایل

یکم تفریح بیشتر با ls
ls احتمالاً پرکاربردترین دستوره. با کمک اون، میتونیم محتوای یه پوشه رو ببینیم و یکسری جزئیات مهم درباره فایلها و پوشه ها رو بفهمیم. همونطور که دیدیم، میتونید خیلی ساده ls رو بنویسیم تا فهرست فایلها و پوشه های فرعی داخل مسیر کاری فعلی رو ببینیم:
[me@ncis-ir ~]$ ls
Applications  Documents  Music     Public  Templates  ZS Workspace
Desktop       Downloads  Pictures  Shared  Videos

درکنار مسیر کاری فعلی، میتونیم مسیری که میخوایم محتواش رو ببینیم هم مشخص کنیم:
[me@ncis-ir ~]$ ls /usr
bin  games include lib  local  sbin  share  src

یا حتی میتونیم چند مسیر رو مشخص کنیم. توی مثال زیر، ما پوشه خانه کاربر جاری (با نماد ~) و پوشه usr/ رو نمایش میدیم:
[me@ncis-ir ~]$ ls ~ /usr
/home/me:
Applications  Documents  Music     Public  Templates  ZS Workspace
Desktop       Downloads  Pictures  Shared  Videos

/usr:
bin  games include lib  local  sbin  share  src

ما میتونیم فرمت نمایش خروجی رو برای بدست آوردن جزئیات بیشتر، تغییر بدیم:
[me@ncis-ir ~]$ ls -l
total 44
drwxrwxr-x  3 me me 4096 Feb 11 16:29 Applications
drwxr-xr-x  2 me me 4096 May  9 11:33 Desktop
drwxr-xr-x  2 me me 4096 Feb  3 16:37 Documents
drwxr-xr-x 10 me me 4096 Jun 21 02:20 Downloads
drwxr-xr-x  2 me me 4096 Feb  3 16:37 Music
drwxr-xr-x  2 me me 4096 Feb  3 21:21 Pictures
drwxr-xr-x  2 me me 4096 Feb  3 16:37 Public
drwxr-xr-x  2 me me 4096 Feb  8 21:19 Shared
drwxr-xr-x  2 me me 4096 Feb  3 16:37 Templates
drwxr-xr-x  2 me me 4096 Feb  3 16:37 Videos
drwxr-xr-x  4 me me 4096 Feb 17 09:32 ZS Workspace

با اضافه کردن l- به دستور، خروجی رو به صورت طولانی (Long) تغییر دادیم.

انتخاب ها و پارامترها
این موضوع ما رو به یه نکته خیلی مهم درباره نحوه کار دستورات میرسونه. دستورات اغلب با یک یا چند انتخاب (Option) دنبال میشن که رفتار اونها رو تغییر میده و بعدش، یک یا چند پارامتر (Argument) میاد که مشخص کننده آیتم هایی هست که دستور باید روی اونها اجرا بشه و کارش رو انجام بده. بنابراین، اغلب دستورات به شکل زیر دیده میشن:
command -options arguments

بیشتر دستورات از انتخابهایی استفاده میکنن که از یک کارکتر تک بعد از یک خط تیره تشکیل شده (مثل l-) اما بعضی دستورات (شامل اونهایی که از پروژه GNU - گنو اومدن)، از انتخابهای طولانی که شامل یک کلمه بعد از دو خط تیره هستن هم پشتیبانی میکنن. همچنین خیلی از دستورات اجازه میدن چندتا از انتخابهای کوتاه رو با هم ادغام کنید. برای نمونه، دستور ls توی مثال زیر دو انتخاب داره، l برای قالب طولانی و t برای مرتب کردن فایلها بر اساس زمان تغییر:
[me@ncis-ir ~]$ ls -lt

ما انتخاب طولانی reverse-- رو برای برعکس کردن ترتیب نتایج اضافه میکنیم:
[me@ncis-ir ~]$ ls -lt --reverse

دستور ls تعداد زیادی انتخاب داره. رایج ترین اونها شامل موارد زیر هست:
  • a- (یا all--) : فهرست تمام فایلها، حتی اونهایی که با . شروع میشن و در حالت عادی نشون داده نمیشن (فایلهای مخفی)
  • d- (یا directory--) : در حالت عادی اگه یه پوشه رو بعنوان پارامتر بدین، ls محتوای داخل پوشه رو نشون میده نه خود پوشه رو. از این انتخاب همراه با l- استفاده کنید تا جزئیات خود پوشه رو بجای فایلهای داخلش ببینید.
  • F- (یا classify--) : این انتخاب یه کارکتر نشانگر به انتهای هر اسمی که فهرست شده اضافه میکنه. برای مثال، یا / به آخر پوشه ها اضافه میشه).
  • h- (یا human-readable--) : توی حالت طولانی، حجم فایلها رو با ساختاری که برای انسانها راحتتره (کیلوبایت، مگابایت و...) بجای بایت نشون میده.
  • l- : نمایش اطلاعات در قالب طولانی
  • r- (یا reverse--) : نتایج رو به ترتیب معکوس نشون میده. در حالت عادی ls نتایج رو بصورت صعودی الفبایی نشون میده.
  • S- : نتایج رو برحسب اندازه فایل مرتب میکنه.
  • t- : نتایج رو برحسب آخرین زمان تغییر فایلها مرتب میکنه.

یه نگاه عمیقتر به قالب طولانی
همونطور که دیدیم، انتخاب l- باعث میشه ls نتایج رو در قالب طولانی نمایش بده. این قالب شامل اطلاعات سودمند زیادیه. مثالی از محتوای یکی از پوشه ها رو مشاهده کنید:
-rw-r--r-- 1 root root 3576296  2012-04-03 11:05  Experience ubuntu.ogg
-rw-r--r-- 1 root root 1186219  2012-04-03 11:05  kubuntu-leaflet.png
-rw-r--r-- 1 root root 47584    2012-04-03 11:05  logo-Edubuntu.png
-rw-r--r-- 1 root root 44355    2012-04-03 11:05  logo-Kubuntu.png
-rw-r--r-- 1 root root 34391    2012-04-03 11:05  logo-Ubuntu.png
-rw-r--r-- 1 root root 32059    2012-04-03 11:05  oo-cd-cover.odf
-rw-r--r-- 1 root root 159744   2012-04-03 11:05  oo-derivatives.doc
-rw-r--r-- 1 root root 27837    2012-04-03 11:05  oo-maxwell.odt
-rw-r--r-- 1 root root 98816    2012-04-03 11:05  oo-trig.xls
-rw-r--r-- 1 root root 453764   2012-04-03 11:05  oo-welcome.odt
-rw-r--r-- 1 root root 358374   2012-04-03 11:05  ubuntu Sax.ogg

اجازه بدین به هر بخش از اطلاعات یکی از فایلها نگاهی داشته باشیم:
  • --rw-r-r- : حق دسترسی به فایل. اولین کارکتر نوع فایل رو مشخص میکنه. - به معنای فایل معمولیه. اگه d بود معناش پوشه (Directory) هست. سه حرف بعدی سطح دسترسی فایل رو برای مالک اون مشخص میکنن. سه حرف بعدی سطح دسترسی گروهی که مالک فایل عضوشه رو مشخص میکنه و سه حرف آخر هم سطح دسترسی بقیه افراد رو تعیین میکنه. درمورد این موارد در آینده بیشتر صحبت میکنیم.
  • 1 : تعداد لینکهای سخت (Hard Link) فایل. درمورد مبحث لینکها تو انتهای همین قسمت توضیح میدیم.
  • root : نام کاربری مالک فایل
  • root : نام گروهی که مالک فایل عضوشه
  • 32059 : حجم فایل برحسب بایت
  • 11:05 2012-04-03 : تاریخ و زمان آخرین تغییر فایل
  • oo-cd-cover.odf : نام فایل

تشخیص نوع فایل با دستور file
وقتی توی سیستم داریم میگردیم، فهمیدن اینکه یه فایل شامل چه محتوایی هست، سودمنده. برای انجام این کار، از دستور file استفاده میکنیم تا بفهمیم نوع فایل چیه. همونطور که قبلاً گفتیم، اسامی فایلها توی لینوکس لازم نیست پسوند داشته باشن و نوع فایل هم از روی پسوندش تشخیص داده نمیشه. برای مثال، ممکنه توی ویندوز فایل picture.jpg حتماً یه عکسه ولی توی لینوکس ممکنه اینطور نباشه. ممکنه حتی فایل عکسی داشته باشیم که پسوند نداشته باشه. ما میتونیم از دستور file به شکل زیر برای فهمیدن نوع یه فایل استفاده کنیم:
file filename

وقتی که این دستور رو صدا بزنیم، یه شرح خلاصه از محتوای فایل دریافت میکنیم. مثال:
[me@ncis-ir ~]$ fiel picture.jpg
picture.jpg JPEG image data, JFIF standard 1.01

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

با وجود اینکه خیلی از فایلها روی سیستم شما آشنا هستن (مثلاً فایلهای MP3 و JPEG)، خیلی انواع دیگه وجود دارن که کمتر واضحن و یه تعدادی هم کمی عجیب بنظر میان.

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

چرا میخوایم فایلهای متنی رو بررسی کنیم؟ چون خیلی از فایلهایی که شامل تنظیمات سیستم هستن (و بهشون فایلهای پیکربندی میگیم) با این قالب ذخیره شدن و توانایی خوندن اونها به ما دید خوبی درباره نحوه کارکرد سیستم میده. بعلاوه، خیلی ازبرنامه های واقعی که سیستم ازشون استفاده میکنه (که بهشون اسکریپت میگیم) هم با این قالب ذخیره شدن. توی آموزشهای آینده، یاد میگیریم که چطور فایلهای متنی رو برای تغییر تنظیمات سیستم، تغییر بدیم و اسکریپتهای سفارشی خودمون رو بنویسیم ولی برای الان، فقط میخوایم محتواشون رو ببینیم.

نقل قول:«متن» چیه؟
راههای زیادی برای نمایش اطلاعات توی کامپیوتر وجود داره. همه روشها شامل تعریف یه ارتباط بین اطلاعات و یکسری اعداد هستن که برای نمایش اون استفاده میشن. کامپیوترها درنهایت فقط اعداد رو میفهمن و تمام داده ها به معادلهای عددی خودشون تبدیل میشن.

بعضی از این سیستمهای معادلسازی خیلی پیچیده هستن (مثلاً فایلهای تصویری فشرده شده)، درحالی که بعضی دیگه از اونها خیلی ساده هستن. یکی از قدیمی ترین و ساده ترین اونها، ASCII (با تلفظ اَسکی) هست که مخفف American Standard Code for Information Interchange و به معنای کد استاندارد امریکایی برای تبادل اطلاعات هست. این کدگذاری ساده اولین بار توی ماشینهای تایپ راه دور استفاده شد.

متن (Text) یه نگاشت ساده یک به یک کارکترها به اعداد هست که خیلی فشرده است. پنجاه کارکتر متن معادل پنجاه بایت داده است. این متن که ما میگیم، اصلاً شبیه متنی که توی Microsoft Word یا OpenOffice.org Writer میبینید نیست. اون فایلها برخلاف فایلهای متنی ساده ASCII، شامل خیلی عناصر غیر متنی هستن که ساختار و قالب متن رو مشخص میکنن. فایلهای متنی ساده ASCII فقط شامل کارکترها هستن و یکسری کارکترهای کنترلی خیلی ساده مثل Tab و Enter و... رو شامل میشن.

توی یه سیستم لینوکس، فایلهای خیلی زیادی توی قالب متنی ذخیره میشن و خیلی از ابزارهای لینوکس با فایلهای متنی کار میکنن. حتی ویندوز هم اهمیت این قالب رو تشخیص میده. برنامه معروف Notepad یه ویرایشگر فایلهای متنی ساده ASCII محسوب میشه.

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

وقتی دستور اجرا شد، less به شما اجازه میده توی محتوای فایل به جلو یا عقب حرکت کنید. برای مثال، اگه میخواین فایلی که تمامی اکانتهای کاربران سیستم رو تعریف میکنه رو مشاهده کنید، دستور زیر رو اجرا کنید:
[me@ncis-ir ~]$ less /etc/passwd

وقتی برنامه less شروع به کار کرد، میتونیم محتوای فایل رو ببینیم. اگه فایل از یه صفحه بزرگتر بود، میتونیم با جهتهای بالا و پایین فایل رو پیمایش کنیم. برای خروج از less کلید Q رو بزنید.
توی فهرست زیر میتونید فهرست برخی از کلیدهایی که توی less کاربرد دارن رو مشاهده کنید:
  • Page Up یا b : حرکت به اندازه یک صفحه به عقب
  • Page Down یا Space : حرکت به اندازه یک صفحه به جلو
  • جهت بالا : حرکت به اندازه یک خط به عقب
  • جهت پایین : حرکت به اندازه یک خط به جلو
  • G : حرکت به انتهای متن
  • 1G یا g : حرکت به ابتدای متن
  • (character(s/ : جستجو به سمت جلو به دنبال کارکتر(های) مشخص شده
  • n : جستجو به دنبال محل قرارگرفتن دوباره متن جستجو شده قبلی به جلو
  • h : نمایش صفحه راهنما (شامل تمامی کلیدهای میانبر)
  • q : خروج از less

نقل قول:LESS is MORE
برنامه less بعنوان نسخه توسعه یافته و جایگزین یه برنامه قدیمی تر Unix به اسم more طراحی شد. اسم این برنامه، بازی با عبارت «less is more» هست که یکی از شعارهای معمارها و طراحان مدرن محسوب میشه و ازطرفی بیان کننده این حقیقته که less همون more هست (که توسعه پیدا کرده).

less توی دسته برنامه هایی قرار میگیره که اصطلاحاً بهشون Pager میگن. برنامه هایی که به شما اجازه میدن محتوای طولانی اسناد رو بصورت صفحه به صفحه مشاهده کنید. برنامه more فقط به شما اجازه میداد به صفحات جلوتر حرکت کنید، درحالیکه less اجازه حرکت به سمت جلو و عقب رو در بین صفحات میده و خیلی قابلیتهای دیگه هم داره.

یه تور همراه با راهنما
ساختار سیستم فایل توی سیستم لینوکس شما خیلی شبیه چیزیه که توی بقیه سیستمهای شبیه Unix دیده میشه. طراحی اون درحقیقت توی یه استاندارد منتشر شده به اسم «استاندارد سلسله مراتبی سیستم فایل لینوکس» تعریف شده. تمام توزیعهای لینوکس دقیقاً از این استاندارد پیروی نمیکنن، اما اغلبشون خیلی بهش نزدیک هستن.
خوب، میخوایم کمی دوروبر سیستم فایل بچرخیم تا ببینیم چه چیزی سیستم لینوکس ما رو تشکیل داده. یکی از چیزهایی که ما کشف خواهیم کرد اینه که خیلی از فایلهای جذاب، متنهای عادی و خوانا برای انسان هستن. همینطور که توی تور جلو میریم، موارد زیر رو امتحان کنید:
  1. با دستور cd وارد مسیر مشخص شده بشین.
  2. فهرست فایلها و پوشه های داخلش رو با ls -l مشاهده کنید.
  3. اگه فایل جالبی دیدین، با دستور file محتواش رو ارزیابی کنید.
  4. اگه بنظر رسید متنیه، سعی کنید اون رو با less مشاهده کنید.

نکته: ترفند Copy و Paste رو به خاطر بیارین. اگه از ماوس استفاده میکنید، میتونید روی یک نام فایل دوبار کلیک کنید تا توی حافظه کپی بشه و با کلیک وسط ماوس، اون رو توی دستور الصاق کنید (بچسبونید).

همینطور که جلو میریم، از اینکه به همه چیز یه نگاهی بندازین نترسین. کاربران عادی معمولاً از دستکاری چیزهای مختلف منع میشن. این کار وظیفه مدیران سیستمه! اما نگاه کردن که ضرری نداره، داره؟ اگه یه دستور درباره یه چیزی بهتون هشدار داد، بیخیالش بشین و گزینه بعدی رو امتحان کنید. فراموش نکنید که توی لینوکس هیچ راز مخفی وجود نداره! فهرست زیر فقط چند مورد از پوشه هایی هست که میتونیم بررسی کنیم. راحت باشین و چیزهای دیگه رو هم امتحان کنید.
  • / پوشه ریشه، جایی که همه چیز از اونجا شروع میشه.
  • bin/ شامل فایلهای اجرایی (برنامه هایی) هست که باید باشن تا سیستم بالا بیاد و اجرا بشه.
  • boot/ شامل هسته لینوکس، Image دیسک RAM اولیه (برای درایورهایی که در زمان راه اندازی لازم هستن) و بارگذار راه اندازی (Boot Loader) هست. فایلهای جالبش شامل boot/grub/grub.conf/ یا menu.lst هست که برای تنظیم کردن بارگذاری راه اندازی به کار میره. همچنین boom/vmlinuz/ هم اینجا قرار داره که هسته لینوکس رو شامل میشه.
  • dev/ این یه پوشه خاصه که شامل اتصالات دستگاههاست. «هر چیزی یه فایله» شامل دستگاهها هم میشه. اینجا جاییه که هسته لینوکس فهرست تمام دستگاههای که میشناسه رو نگهداری میکنه.
  • etc/ این پوشه شامل تمام فایلهای تنظیماتی هست که توی کل سیستم استفاده میشن. همچنین شامل مجموعه ای از اسکریپتهای شل هست که هرکدوم از سرویسهای سیستم رو در زمان راه اندازی، اجرا میکنن. هر چیزی توی این پوشه باید یه محتوای متنی قابل خوندن باشه.
    فایلهای جذاب: خوب همه چی توی etc/ جذابه ولی این چندتا از بقیه بیشتر نظر من رو جلب میکنن: etc/crontab/ که یه فایله که کارهای خودکاری که باید سر زمان مشخصی اجرا بشن رو تعریف میکنه، etc/fstab/ که جدولی از دستگاههای ذخیره سازی و نقاط اتصال مربوط به هرکدوم رو نگهداری میکنه و etc/passwd/ که فهرست تمام اشتراکهای کاربری سیستم رو شامل میشه.
  • home/ با تنظیمات عادی، هر کاربر یه پوشه توی home/ داره که کاربران معمولی فقط اجازه دارن توی پوشه خودشون بنویسن. این محدودیت باعث محافظت از سیستم دربرابر کاربران خطاکار میشه.
  • lib/ شامل فایلهای کتابخانه ای مشترکی هست که توسط برنامه های هسته سیستم به کار گرفته میشن. یه چیزی شبیه DLLها توی ویندوز هستن.
  • lost+found/ هر پارتیشن یا وسیله قالب بندی شده که از یکی از سیستم فایل های لینوکس استفاده میکنه (مثل Ext3 و...× این پوشه رو داره. در مواقعی که عملیات بازیابی از خرابی سیستم فایل انجام میشه، فایلهایی که گم شدن و پیدا میشن رو میتونید اینجا پیدا کنید. بجز در مواقعی که یه اتفاق واقعاً بد توی سیستم شما رخ داده باشه، این پوشه خالی باقی میمونه.
  • media/ توی سیستمهای مدرن لینوکس این پوشه شامل نقاط اتصال رسانه های قابل جدا شدن مثل USB درایوها، CD-ROMها و... است که بطور خودکار وقتی وصل میشن، متصل هم میشن (و سیستم اونها رو میشناسه).
  • opt/ این پوشه برای نصب نرم افزارهای اختیاری (Optional) بکار میره. اغلب برای نگهداری برنامه های تجاری بکار میره که روی سیستم شما نصب شدن.
  • proc/ این پوشه یکم خاصه. درحقیقت یه سیستم فایل ساده به معنای فایلی که روی هارد درایو شما باشه نیست. در عوض، یه سیستم فایل مجازیه که توسط هسته لینوکس مدیریت میشه. فایلهای داخلش درحقیقت روزنه هایی توی خود هسته محسوب میشن. فایلها قابل خوندن هستن و به شما دیدی از چگونگی نگاه هسته لینوکس به کامپیوتر شما میدن.
  • root/ اینجا، پوشه خانگی اشتراک root (اشتراک اصلی و مدیر سیستم) محسوب میشه.
  • sbin/ این پوشه حاوی برنامه های خود سیستمه. این برنامه همونهایی هستن که کارهای حیاتی سیستم رو انجام میدن و عموماً برای کاربران ویژه (Superuser) رزرو شدن.
  • tmp/ این پوشه برای نگهداری فایلهای موقتی که توسط برنامه های مختلف تولید میشن، درنظر گرفته شده. برخی از تنظیمات باعث میشن این پوشه هربار که سیستم مجدداً راه اندازی میشه، خالی بشه.
  • usr/ این پوشه و زیرمجموعه هاش تقریباً بزرگترین پوشه یه سیستم لینوکس محسوب میشن. تمام برنامه ها و فایلهای پشتیبانی اونها که توسط کاربران عادی مورد استفاده قرار میگیرن، اینجا هستن.
  • usr/bin/ شامل برنامه های اجرایی نصب شده روی توزیع لینوکس شماست. نگهداری هزاران برنامه توی این پوشه، چیز عجیب و غیرمعمولی نیست.
  • usr/lib/ این پوشه شامل کتابخانه های مشترک برنامه هایی هست که توی usr/bin/ قرار دارن.
  • usr/local/ این پوشه و زیرمجموعه هاش محل نگهداری برنامه هایی هستن که توی توزیع لینوکس شما موجود نبودن (همراه خودش موقع نصب) ولی برای استفاده در کل سیستم، نصب شدن. برنامه هایی که از سورس کد کامپایل شدن، معمولاً توی usr/local/bin/ نصب میشن. توی یه سیستم لینوکس که به تازگی نصب شده، این پوشه وجود داره ولی تا وقتی که مدیر سیستم چیزی داخلش نصب نکنه، خالیه.
  • usr/sbin/ شامل برنامه های مدیریتی جانبیه.
  • usr/share/ این پوشه حاوی تمامی داده های به اشتراک گذاشته شده با برنامه های داخل usr/bin/ هست. این موضوع شامل مواردی مثل فایلهای تنظیمات پیش فرض، آیکن ها، تصاویر پس زمینه، فایلهای صدا و... است.
  • usr/share/doc/ اغلب پکیجهای نصب شده توی سیستم شامل یک سری مستندات هستن. توی این مسیر ما فایلهای مستندات رو به تفکیک پکیج میتونیم مشاهده کنیم.
  • var/ بجز tmp/ و home/، بقیه پوشه هایی که نگاه کردیم، نسبتاً ایستا باقی میمونن؛ یعنی محتوای اونها تغییر نمیکنه. var/ و زیرمجموعه هاش، جایی هستن که داده هایی که معمولاً تغییر میکنن رو نگهداری میکنیم. پایگاههای داده مختلف، فایلهای صف زمانبندی، ایمیلهای کاربران و... اینجا نگهداری میشن.
  • var/log/ این پوشه شامل فایلهای گزارش گیری و ثبت واقع و فعالیتهای مختلف سیستمه. اینها خیلی مهم هستن و باید مرتباً بررسی و بازبینی بشن. مهمترینشون var/log/messages/ هست. دقت کنید که بخاطر مسائل امنیتی توی برخی سیستمها، شما باید یه کاربر ویژه (Superuser) باشین تا بتونید این فایلهای Log رو مشاهده کنید.

لینک نمادین (Symbolic Link)
همینطور که اینطرف و اونطرف میگردین، ممکنه یکسری فایلها ببینید که جزئیاتشون شبیه این نمونه است:
lrwxrwxrwx 1 root root   11 2012-08-11 07:34 lib.so.6 -> libc-2.6.so

متوجه شدین که حرف اول کد بالا l هست و بنظر میاد دوتا اسم داره؟ این یه نوع خاص فایله که بهش لینک نمادین میگن (که به اسامی لینک نرم یا Soft link یا Symlink هم میشناسنش. توی اغلب سیستمهای شبیه یونیکس، این امکان وجود داره که یه فایل، توسط اسامی مختلفی صدا زده بشه. با وجود اینکه ممکنه الان ارزشش خیلی واضح نباشه، ولی واقعاً یه قابلیت سودمند محسوب میشه.

این سناریو رو تصور کنید: یه برنامه نیاز به استفاده از یه منبع مشترک از هر نوعی رو داره که حاوی یه فایل به اسم foo هست ولی foo چند تغییر نسخه مختلف داشته. بهتره که شماره نسخه رو هم توی اسم فایل بیاریم تا مدیر سیستم یا هر فرد دیگه که میخواد از سیستم استفاده کنه، بفهمه که چه نسخه ای از foo نصب شده. خوب این یه مشکل ایجاد میکنه. اگه ما اسم فایل منبع مشترک رو عوض کنیم، مجبوریم تمام برنامه هایی که ازش استفاده کرده بودن رو بررسی کنیم و اونها رو به شکلی تغییر بدین که دنبال foo با اسم جدیدش بگردن و این کار باید هربار که نسخه جدیدی ثبت میشه، انجام بشه. این کار بنظر اصلاً جالب نیست.

خوب این الان مثال خوبیه از جایی که یه لینک نمادین، روز شما رو نجات میده. فرض کنید ما نسخه 2.6 از foo رو نصب کردیم که اسم فایلش foo-2.6 هست و بعد، یه لینک نمادین براش درست کردیم که بهش یه اسم ساده تر foo رو دادیم و وقتی foo اجرا میشه، درحقیقت foo-2.6 رو صدا میزنه و معناش اینه که وقتی برنامه ای foo رو باز کنه، foo-2.6 باز میشه. حالا همه خوشحالن. برنامه ای که با foo وابسته است، میتونه پیداش کنه و ما هم میتونیم بفمهیم الان چه نسخه ای از foo نصب شده. وقتی نوبت به ارتقاء foo به نسخه 2.7 برسه، ما فقط فایل رو به سیستم اضافه میکنیم، لینک نمادین foo رو حذف میکنیم و یه foo جدید که به foo-2.7 اشاره میکنه میسازیم. ته تنها این کار مشکل ارتقاء نسخه رو حل میکنه، بلکه به ما اجازه میده هر دو نسخه رو روی سیستم داشته باشیم. تصور کنید نسخه 2.7 یه باگ داشته باشه (از دست این برنامه نویسهای بد!) و ما نیاز به بازگشت به نسخه قدیمی داریم. خوب میتونیم دوباره لینک نمادین رو حذف کنیم و یکی دیگه که به foo-2.6 اشاره میکنه بجاش بسازیم.

مثال بالا (از پوشه lib/ توی یه سیستم Fedora) یه لینک نمادین رو داره نشون میده که اسمش libc.so.6 هست و به یه فایل کتابخانه مشترک به اسم libc-2.6.so اشاره میکنه و معناش اینه که برنامه هایی که دنبال libc.so.6 هستن، درحقیقت libc-2.6.so رو دریافت میکنن. درمورد روش ساخت لینکهای نمادین توی جلسات بعد توضیح میدیم.

نقل قول:لینکهای سخت
حالا که درمورد موضوع لینکها حرف زدیم، لازمه بگیم که یه نوع دیگه از لینکها هم وجود دارن که بهشون میگیم لینک سخت (Hard Link). لینکهای سخت هم اجازه میدن فایلها اسامی مختلفی داشته باشن، اما به یه شکل دیگه اینکار رو انجام میدن. درمورد تفاوتهای بین لینکهای نمادین و لینکهاس سخت توی جلسات بعد بیشتر توضیح میدیم.
#10
دستکاری فایلها و پوشه ها
تو این مرحله، آماده ایم که یکم کار واقعی انجام بدیم. این قسمت از آموزش به دستورات زیر اختصاص داره:
  • cp کپی کردن فایلها و پوشه ها
  • mv جابجاکردن/تغییر نام فایلها و پوشه ها
  • mkdir ایجاد پوشه
  • rm حذف فایل ها و پوشه ها
  • ln ایجاد لینکهای سخت و نمادین

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

جواب، قدرت و انعطاف پذیریه. انجام دستکاریهای ساده روی فایلها با یه مدیر فایل گرافیکی راحته، اما کارهای پیچیده رو میشه با برنامه های خط فرمان، راحتتر انجام داد. برای مثال، چطور میخواین تمام فایلهای HTML رو از یه پوشه به یکی دیگه کپی کنید، متنها فقط اونهایی که توی پوشه مقصد وجود ندارن یا جدیدتر از نسخه موجود توی پوشه مقصد هستن؟ خوب این کار با مدیر فایل شاید خیلی سخت باشه، درحالی که با خط فرمان خیلی راحته:
cp -u *.html destination

نشانه های جایگزین
قبل از اینکه دستوراتمون رو توضیح بدین، لازمه درباره قابلیتی از Shell که این دستورات رو اینقدر قدرتمند کرده صحبت کنیم. بدلیل اینکه شل خیلی با اسامی فایلها کار میکنه، یکسری کارکترهای خاص معرفی کرده که به شما توی مشخص کردن سریع گروههای از فایلها کمک میکنه. این کارکترهای خاص، نشانه های جایگزین (Wildcard) نامیده میشن. استفاده از نشانه های جایگزین (که بهش Globbing هم میگن)، به شما اجازه میده که اسامی فایلها رو براساس الگوهای کارکترها انتخاب کنید. فهرست زیر، نشانه های جایگزین و چیزی که میتونن انتخاب کنن رو نشون میده:
  • * هر تعداد کارکتر (هر کارکتری)
  • ? فقط یک کارکتر (هر کارکتری)
  • [characters] فقط یک کارکتر (کارکترهای جزو مجموعه مشخص شده)
  • [characters!] فقط یک کارکتر (کارکترهایی که جزو مجموعه مشخص شده نیستن)
  • [[:class:]] فقط یک کارکتر (کارکترهای جزو کلاس مشخص شده)

فهرست زیر هم کلاسهایی رو مشخص میکنه که میتونین استفاده کنین:
  • [:alnum:] هر کارکتر جزو حروف الفبای لاتین و اعداد
  • [:alpha:] حروف الفبای لاتین
  • [:digit:] اعداد
  • [:lower:] حروف کوچک الفبای لاتین
  • [:upper:] حروف بزرگ الفبای لاتین

استفاده از نشانه های جایگزین به شما امکان انتخابهای موردنظرتون رو برای اسامی فایلها میده. به چند مثال دقت کنید:
  • * تمام فایلها
  • g* هر فایلی که با g شروع بشه
  • b*.txt تمام فایلهایی که با b شروع میشن و بعدش هر کارکتری میاد و به txt. ختم میشن
  • ???Data هر فایلی که با Data شروع بشه و بعدش دقیقاً سه کارکتر داشته باشه
  • *[abc] هر فایلی که با a یا b یا c شروع بشه
  • [BACKUP.[0-9][0-9][0-9 هر فایلی که با .BACKUP شروع بشه و بعدش دقیقاً سه رقم 0 تا 9 داشته باشه
  • *[[:upper:]] هر فایلی که با یه حرف بزرگ شروع بشه
  • *[[:digit:]!] هر فایلی که با عدد شروع نشه
  • [lower:]123:]]* هر فایلی که به یه حرف کوچک یا یکی از اعداد 1 یا 2 یا 3 ختم بشه

نشانه های جایگزین رو میتونید توی هر دستوری که اسم فایل بعنوان پارامتر میگیره، استفاده کنید ولی درموردشون بعداً بیشتر صحبت میکنیم.

نقل قول:محدوده کارکترها
اگه قبلاً با یه محیط شبیه Unix کار کرده باشین یا کتابهایی در این زمینه خونده باشین، احتمالاً متوجه الگوهایی شبیه [A-Z] یا [a-z] شدین. این الگوها، ساختارهای سنتی Unix هستن و توی نسخه های قدیمی لینوکس هم کار میکنن. هنوز هم میتونین از اونها استفاده کنین ولی باید خیلی مراقب باشین چون اگه به درستی تنظیم نشده باشن، ممکنه نتیجه موردنظر شما رو تولید نکنن. فعلاً همینقدر بدونید که باید از این روشها استفاده نکنید و بجاشون کلاسهای کارکترها رو بکار ببرین.

نقل قول:کارکترهای جایگزین توی GUI هم کار میکنن
این کارکترها واقعاً ارزشمند هستن. نه تنها بخاطر اینکه میشه از اونها توی خط فرمان استفاده کرد، بلکه بخاطر اینکه توی برخی از برنامه های مدیر فایل گرافیکی هم پشتیبانی میشن.
  • توی Nautilus (مدیر فایل GNOME) میتونید فایلها رو با کمک منوی Edit و گزینه Select Pattern انتخاب کنید. فقط کافیه الگوی انتخاب خودتون رو با کمک نشانه های جایگزین وارد کنید و فایلهای پوشه ای که درحال حاضر نشون داده شده و با اون الگو مطابقت دارن، انتخاب میشن.
  • توی مدیر فایل XFCE از منوی Edit گزینه Select by Pattern رو انتخاب کنید (یا Ctrl+S رو بزنید) و الگوی موردنظر رو وارد کنید.
  • توی برخی از نسخه های Dolphin و Konqueror (مدیرهای فایل KDE) میتونید مستقیماً نشانه های جایگزین رو توی نوار آدرس وارد کنید. برای مثال، اگه میخوایم تمام فایلهایی که با یه حرف کوچک u شروع میشن رو داخل مسیر usr/bin/ ببینید، توی نوار آدرس عبارت *usr/bin/u/ رو وارد کنید.

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

mkdir ساخت پوشه ها
دستور mkdir که مخفف Make Directory هست، پوشه ها رو میسازه. برای استفاده از اون باید این شکلی کار کنید:
mkdir directory...

نکته مهم: توی این آموزش هروقت سه نقطه بعد از یه پارامتر توی یه دستور اومد (مثل بالا)، معناش اینه که میتونین اون پارامتر رو تکرار کنید. بنابراین، توی این مثال:
mkdir dir1
یه پوشه به اسم dir1 میسازه درحالی که:
mkdir dir1 dir2 dir3
سه پوشه dir1 و dir2 و dir3 رو تولید میکنه.

cp کپی فایلها و پوشه ها
دستور cp که مخفف Copy هست، فایلها و پوشه ها رو کپی میکنه. میشه از اون به دو شکل مختلف استفاده کرد:
cp item1 item2
برای کپی کردن یه فایل یا پوشه به اسم item1 به فایل یا پوشه item2 و:
cp item... directory
برای کپی کردن چند فایل یا پوشه داخل یک پوشه مقصد.

دستور cp چند سوئیچ انتخاب هم داره که قبل از پارامترهای مبدأ و مقصد باید بنویسید (نسخه کوتاه و طولانی، معادل هم هستن) :
  • a- یا archive-- فایلها و پوشه ها و تمام خصوصیاتشون رو شامل مالک و مجوزها، کپی میکنه. در حالت عادی، نسخه های کپی شده، خصوصیات پیشفرض کاربردی که عمل کپی رو انجام میده به خودشون میگیرن.
  • i- یا interactive-- قبل از بازنویسی یه فایل موجود، یه پیغام برای تأیید کاربر ظاهر میشه. اگه این گزینه رو تعریف نکنید، cp بدون سروصدا فایلها رو رونویسی میکنه.
  • r- یا recursive-- کپی کردن پوشه ها و محتوای داخلشون بصورت بازگشتی. این گزینه (یا a-) وقتی از یه پوشه میخواین کپی بگیرین، ضروریه.
  • u- یا update-- وقتی فایلها رو از یه پوشه به یکی دیگه کپی میکنید، فقط فایلهایی که وجود ندارن یا جدیدتر از نسخه موجود توی پوشه مقصد هستن رو کپی میکنه.
  • v- یا vervose-- پیغامهای اطلاع رسانی رو درطی انجام عملیات کپی به شما نشون میده.

مثالهایی از cp :
cp file1 file2
file1 رو توی file2 کپی میکنه. اگه file2 وجود داشته باشه، با محتوای file1 رونویسی میشه. اگه وجود نداشته باشه هم ایجاد میشه.

cp -i file1 file2
مثل بالا، فقط با این تفاوت که اگه file2 وجود داشته باشه، از کاربر برای رونویسی اون اجازه گرفته میشه.

cp file1 file2 dir1
file1 و file2 رو داخل پوشه dir1 کپی میکنه. dir1 باید از قبل وجود داشته باشه.

cp dir1/* dir2
با کمک نشانه جایگزین * تمام فایلهای داخل dir1 توی پوشه dir2 کپی میشن. dir2 باید وجود داشته باشه.

cp -r dir1 dir2
dir1 (و تمام فایلها و پوشه های فرعی داخلش) رو داخل dir2 کپی میکنه. اگه dir2 وجود نداشته باشه، ایجاد میشه و محتواش دقیقاً مثل dir1 خواهد بود.

mv جابجایی و تغییر نام فایلها و پوشه ها
دستور mv که مخفف Move هست، هر دو کار جابجایی و تغییر نام رو بسته به اینکه چطور ازش استفاده کنین، انجام میده. در هر دو صورت، فایل یا پوشه اصلی دیگه بعد از انجام کار، وجود نخواهد داشت. روش کار mv خیلی شبیه cp هست:
برای جابجایی یا تغیین نام یه فایل یا پوشه:
mv item1 item2

و برای منتقل کردن یک یا چند فایل یا پوشه به پوشه جدید:
mv item... directory

دستور mv توی چندتا از انتخابها و سوئیچها با cp مشترکه:
  • i- یا interactive-- قبل از رونویسی یه فایل موجود، از کاربر تأییدیه میخواد. اگه این گزینه رو انتخاب نکنید، mv بی سروصدا فایلها رو رونویسی میکنه.
  • u- یا update-- وقتی فایلها رو از یه پوشه به پوشه دیگه جابجا میکنه، فقط فایلهایی که توی مسیر مقصد وجود ندارن یا جدیدتر هستن رو منتقل میکنه.
  • v- یا verbose-- پیامهای توضیحی درحین انتقال به شما نشون میده.

مثالهایی از mv :

[*]mv file1 file2
file1 رو به file2 تغییر نام میده. اگه file2 وجود داشته باشه، با محتوای file1 رونویسی میشه. اگه وجود نداشته باشه هم ساخته میشه. درهرصورت file1 دیگه وجود نخواهد داشت.

mv -i file1 file2
مثل بالا با این فرق که اگه file2 وجود داشته باشه، قبل از رونویسی از شما اجازه میگیره.

mv file1 file2 dir1
file1 و file2 رو به پوشه dir1 منتقل میکنه. dir1 باید وجود داشته باشه.

mv dir1 dir2
dir1 (و محتوای داخلش رو) به داخل dir2 منتقل میکنه. اگه dir2 وجود نداشته باشه، ساخته میشه (عملاً dir1 به dir2 تغییر نام داده میشه).

rm حذف فایلها و پوشه ها
دستور rm که مخفف Remove هست، برای حذف فایلها و پوشه ها بکار میره. اینطوری:
rm item...

نقل قول:حواستون به rm باشه
سیستمهای شبیه Unix مثل لینوکس دستوری برای برگردوندن فایل حذف شده ندارن. وقتی یه چیزی رو با rm پاک کردین، لینوکس فرض میکنه اینقدر هوشمند هستین که بدونین چیکار میکنین.

بخصوص درمورد نشانه های جایگزین مراقب باشین. این مثال رو درنظر بگیرین: فرض کنید میخواین فقط فایلهای HTML رو از یه پوشه حذف کنید. خوب برای این کار مینویسین:
rm *.html

خوب این درسته. اما اگه اشتباهاً دستتون بعد از * روی کلید Space بخوره چی میشه؟
rm * .html

rm اول تمام فایلها پوشه جاری رو حذف میکنه و بعد اعتراض میکنه که فایلی به اسم html. رو پیدا نکرده.

یه ترفند مفید: هروقت از نشانه های جایگزین با rm استفاده میکنین، (ضمن اینکه حواستون به تایپ کردنتون باید باشه)، قبلش با ls نشانه های جایگزین رو تست کنید. اگه دقیقاً همون فایلهایی که میخواستین حذف کنین فهرست شدن، اونوقت با دکمه جهت بالا روی صفحه کلید، دستور قبلی رو بیارین و ls رو با rm تعویض کنید.

فهرست سوئیچهای rm رو مشاهده کنید:
  • i- یا interactive-- قبل از حذف هر فایل از شما اجازه میگیره. اگه این گزینه رو انتخاب نکنید، rm بی سروصدا فایلها رو حذف میکنه.
  • r- یا recursive-- بصورت بازگشتی عمل حذف پوشه ها انجام میشه. معناش اینه که اگه یه پوشه که قراره حذف بشه، دارای پوشه های فرعی داخلش هست، اونها هم حذف میشن. برای حذف کامل یه پوشه باید این گزینه رو انتخاب کنید.
  • f- یا force-- فایلهایی که وجود ندارن (و شما مشخص کردین که حذف بشن) رو نادیده میگیره و خطا نمیده. این گزینه باعث غیرفعال شدن گزینه i- یا interactive-- میشه.
  • v- یا verbose-- درحین حذف فایلها، یکی یکی به شما پیغام میده که چه فایلی حذف شد.

مثالهایی از rm :
rm file1
file1 رو بی سروصدا حذف میکنه.

rm -i file1
قبل از حذف file1 از شما اجازه میگیره.

rm -r file1 dir1
file1 و dir1 و محتوای داخلش رو حذف میکنه.

rm -rf file1 dir1
مثل بالایی ولی فقط با این تفاوت که اگه هرکدوم از file1 و dir1 وجود نداشت، پیغام خطا نمیده و ساکت، کارشو ادامه میده.

ln ساخت لینک
دستور ln که مخفف Link هست، برای ساخت لینک سخت (Hard) یا نمادین (Symbolic) بکار میره. به دو صورت زیر میشه ازش استفاده کرد:

ساخت لینک سخت:
ln file link

ساخت لینک نمادین که item میتونه فایل یا پوشه باشه:
ln -s item link

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

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

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

لینکهای نمادین
لینکهای نمادین برای غلبه بر محدودیتهای لینکهای سخت تولید شدن. لینکهای نمادین با ساخت نوع خاصی از فایل که شامل یه اشاره گر متنی به فایل یا پوشه مرجع هست، تولید میشن. به این ترتیب، میتونن شبیه میانبرها (Shortcut) توی ویندوز عمل کنن، البته یادتون نره که چندین سال قبل از این قابلیت ویندوز وجود داشتن و علت اشاره به میانبرهای ویندوز، فقط بخاطر آشنایی شما با مفهومش بود!

یه فایل که توسط یه لینک نمادین بهش اشاره شده و خود لینک نمادین رو خیلی سخت میشه از هم متمایز کرد. برای مثال، اگه چیزی توی لینک نمادین بنویسین، توی فایل مرجع هم نوشته خواهد شد. البته اگه لینک نمادین رو حذف کنید، فقط لینک حذف میشه و فایل اصلی سر جاش خواهد بود. اگه فایل رو قبل از حذف لینک حذف کنید، فقط فایل حذف میشه و لینک باقی میمونه ولی به هیچی اشاره نمیکنه. اینجور وقتها به لینک میگن «شکسته» (Broken). در خیلی از توزیعهای لینوکس، دستور ls لینکهای شکسته رو با یه رنگ مشخص (مثلاً قرمز) نشون میده تا شما رو از وجودشون مطلع کنه.

مفهوم لینکها ممکنه گیج کننده بنظر بیاد ولی صبر کنید. همه این موارد رو میخوایم امتحان کنیم و اونوقت - امیدواریم - براتون جا بیفته.

بیاین زمین بازی رو بسازیم
از اونجا که میخواین یکم دستکاری واقعی روی سیستم فایل انجام بدیم، اجازه بدین یه مکان امن برای «بازی» با دستورات دستکاری فایلها بسازیم. اول نیاز داریم به پوشه بسازیم تا داخلش کار کنیم. ما اینکار رو با ساخت یه پوشه به اسم playground داخل پوشه خانه کاربر خودمون انجام میدیم.

ساخت پوشه ها
دستور mkdir برای ساخت یه پوشه به کار میره. برای ساخت پوشه playground، اول باید مطمئن بشیم که توی پوشه خانه کاربر خودمون هستیم و بعد پوشه رو بسازیم:
[me@ncis-ir ~]$ cd
[me@ncis-ir ~]$ mkdir playground

برای اینکه یکم زمین بازی رو جذابتر کنیم، بذارین چندتا پوشه دیگه داخلش به اسامی dir1 و dir2 بسازیم. برای اینکار اول باید مسیر کاری فعلی رو به playground تغییر بدیم:
[me@ncis-ir ~]$ cd playground
[me@ncis-ir playground]$ mkdir dir1 dir2

یادتون باشه که دستور mkdir چند پارامتر همزمان قبول میکنه که به شما اجازه میده هر دو پوشه رو با یه دستور بسازین.

کپی کردن فایلها
حالا بگذارین یکم اطلاعات وارد زمین بازیمون کنیم. اینکار رو با کپی کردن فایلها انجام میدیم. از دستور cp استفاده کنید تا فایل passwd از مسیر etc/ به پوشه جاری کپی بشه:
[me@ncis-ir playground]$ cp /etc/passwd .

دقت کنید که چطور از میانبر مسیر جاری فعلی یعنی . استفاده کردیم. حالا اگه فایلها رو بخوایم نشون بدیم، میتونیم از ls استفاده کنیم:
[me@ncis-ir playground]$ ls -l
drwxrwxr-x 2 me  me 4096 2015-07-04 12:48 dir1
drwxrwxr-x 2 me  me 4096 2015-07-04 12:48 dir2
-rw-rw-r-- 1 me  me 1962 2015-07-04 12:49 passwd

خوب حالا برای تفریح هم که شده، بگذارین عملیات کپی رو با سوئچی v- تکرار کنیم تا ببینیم چیکار میکنه:
[me@ncis-ir playground]$ cp -v /etc/passwd .
‘/etc/passwd’ -> ‘./passwd’

دستور cp دوباره کپی رو انجام داد ولی این دفعه یه پیام هم نشون داد که داشته چه کاری انجام میداده. دقت کنید که cp کپی اولی رو بدون هیچ پیغام هشداری رونویسی کرد. خوب حالا بذارین سوئیچ i- رو تست کنیم:
[me@ncis-ir playground]$ cp -i /etc/passwd .
cp: overwrite ‘./passwd’?

جواب دادن به سؤال بالا با y باعث رونویسی فایل میشه. هر کارکتر دیگه (مثلاً n) باعث میشه cp فایل رو تنها بذاره و کاری به کارش نداشته باشه.

جابجایی و تغییر نام فایلها
خوب اسم passwd خیلی جذاب بنظر نمیرسه و اینجا هم یه زمین بازیه. پس بذارین اسمشو عوض کنیم:
[me@ncis-ir playground]$ mv passwd fun

خوب بگذارین یکم بیشتر تفریح کنیم و فایلی که تغییر نام دادیم رو توی پوشه ها جابجا کنیم و بعد برگردونیم سر جاش:
[me@ncis-ir playground]$ mv fun dir1
[me@ncis-ir playground]$ mv dir1/fun dir2
[me@ncis-ir playground]$ mv dir2/fun .

حالا بذارین ببینیم mv روی پوشه ها چه اثری داره؟ اول فایلمون رو میبریم توی پوشه dir1 :
[me@ncis-ir playground]$ mv fun dir1

حالا dir1 رو میبریم داخل dir2 و چک میکنیم درست منتقل شده یا نه؟
[me@ncis-ir playground]$ mv dir1 dir2
[me@ncis-ir playground]$ ls -l dir2
total 4
drwxrwxr-x 2 me me 4096 2015-07-04 13:10 dir1
[me@ncis-ir playground]$ ls -l dir2/dir1
total 4
-rw-r--r-- 1 me me 1962 2015-07-04 13:03 fun

دقت کنین که چون dir2 وجود داشت، mv پوشه dir1 رو به داخل dir2 منتقل کرد. اگه dir2 وجود نداشت، mv پوشه dir1 رو به dir2 تغییرنام میداد. بگذارین همه چیز رو برگردونیم سر جاش:
[me@ncis-ir playground]$ mv dir2/dir1 .
[me@ncis-ir playground]$ mv dir1/fun .

ایجاد لینکهای سخت
خوب یکم بریم سراغ لینکها. اول لینک سخت میسازیم. چندتا لینک برای فایلمون میسازیم:
[me@ncis-ir playground]$ ln fun fun-hard
[me@ncis-ir playground]$ ln fun dir1/fun-hard
[me@ncis-ir playground]$ ln fun dir2/fun-hard

حالا که 4 نمونه از فایل fun داریم، بگذارین نگاهی به پوشه playround خودمون بندازیم:
shcode=bash][me@ncis-ir playground]$ ls -l
total 16
drwxrwxr-x 2 me me 4096 2015-07-04 13:16 dir1
drwxrwxr-x 2 me me 4096 2015-07-04 13:16 dir2
-rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun
-rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun-hard[/shcode]

نکته ای که احتمالاً متوجهش شدین اینه که توی فهرست، fun و fun-hard هردو شامل عدد 4 هستن. این عدد تعداد لینکهای سختی هست که برای فایل وجود داره. بخاطر میارین که فایلها همیشه حداقل یه لینک دارن چون اسم فایل ازطریق یه لینک سخت معرفی میشه؟ خوب حالا از کجا بفهمیم fun و fun-hard در اصل هر دو، یه فایل هستن؟ در این مورد، ls کمکی نمیکنه. البته میتونیم ببینیم که حجم فایل دوتاشون یکیه (ستون 5) اما چیز بیشتری دستگیرمون نمیشه و این مورد هم چیزی رو ثابت نمیکنه. برای حل این مشکل، باید یکم عمیقتر بشیم.

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

دستور ls راهی برای کشف این اطلاعات داره. باید اون رو با سوئیچ i- صدا بزنید:
[me@ncis-ir playground]$ls -li
total 16
669404 drwxrwxr-x 2 me me 4096 2015-07-04 13:16 dir1
673911 drwxrwxr-x 2 me me 4096 2015-07-04 13:16 dir2
675344 -rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun
675344 -rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun-hard

توی این مدل از فهرست فایلها، اولین ستون شماره inode هست و همونطور که میبینید، هر دو مورد fun و fun-hard از یه inode دارن استفاده میکنن که تأیید میکنه که هردو، یه فایل هستن.

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

ساخت لینک نمادین شبیه ساخت لینک سخته:
[me@ncis-ir playground]$ ln -s fun fun-sym
[me@ncis-ir playground]$ ln -s ../fun dir1/fun-sym
[me@ncis-ir playground]$ ln -s ../fun dir2/fun-sym

اولین دستور که خیلی سرراسته. ما فقط یه سوئیچ s- اضافه کردیم تا بگیم لینک نمادین (Symbolic) میخوایم بسازیم. اما دوتای دیگه چی؟ یادتون نره که وقتی لینک نمادین میسازیم، داریم یه شرح متنی از جایی که فایل یا پوشه مقصد نسبت به خود لینک قرار داره تولید میکنیم. درک این موضوع با نگاه کردن به خروجی ls راحتتره:
[me@ncis-ir playground]$ ls -l dir1
total 4
-rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun-hard
lrwxrwxrwx 1 me me    6 2015-07-04 14:18 fun-sym -> ../fun

همونطور که میبینید، ls داره میگه fun-sym توی dir1 یه لینک نمادین هست که درحقیقت داره به فایل fun/.. اشاره میکنه که درست هم هست: نسبت به مکان fun-sym فایل fun یک پوشه بالاتر قرار داره. دقت کنید که حجم فایل لینک نمادین 6 هست (تعداد کارکترهای fun/..) نه حجم فایل اصلی fun که بهش اشاره میکنه.

وقتی لینک نمادین درست میکنید، میتونین مسیر مطلق هم بدین:
[me@ncis-ir playground]$ ln -s /home/me/playground/fun dir1/fun-sym

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

علاوه بر فایلهای معمولی، لینکهای نمادین میتونن به پوشه ها هم اشاره کنن:
[me@ncis-ir playground]$ ln -s dir1 dir1-sym
[me@ncis-ir playground]$ ls -l
total 16
drwxrwxr-x 2 me me 4096 2015-07-04 15:09 dir1
lrwxrwxrwx 1 me me    4 2015-07-04 15:13 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2015-07-04 14:18 dir2
-rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun
-rw-r--r-- 4 me me 1962 2015-07-04 13:03 fun-hard
lrwxrwxrwx 1 me me    3 2015-07-04 14:17 fun-sym -> fun

حذف فایلها و پوشه ها
همونطور که قبلاً گفتیم، دستور rm برای حذف فایلها و پوشه ها بکار میره. میخوایم این دستور رو برای اینکه زمین بازی رو کمی پاکسازی کنیم، بکار ببریم. اول بگذارین یکی از لینکهای سخت رو حذف کنیم:
[me@ncis-ir playground]$ rm fun-hard
[me@ncis-ir playground]$ ls -l
total 12
drwxrwxr-x 2 me me 4096 2015-07-04 15:09 dir1
lrwxrwxrwx 1 me me    4 2015-07-04 15:13 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2015-07-04 14:18 dir2
-rw-r--r-- 3 me me 1962 2015-07-04 13:03 fun
lrwxrwxrwx 1 me me    3 2015-07-04 14:17 fun-sym -> fun

خوب کاری که میخواستیم انجام شد. فایل fun-hard حذف شد و همونطور که میبینید، تعداد لینکهای fun از 4 به 3 رسید (ستون دوم). خوب حالا میخوایم خود فایل fun رو حذف کنیم و فقط برای تفریح، از سوئیچ i- استفاده میکنیم تا ببینیم چی میشه:
[me@ncis-ir playground]$ rm -i fun
rm: remove regular file ‘fun’?

با واردکردن y بعنوان جواب، فایل حذف میشه. حالا ببینیم خروجی ls چیه؟ دقت کنید که چی به سر fun-sym اومده؟ چون یه لینک نمادین هست و به فایلی اشاره میکنه که وجود نداره، یه لینک شکسته محسوب میشه و ls اون رو با رنگ قرمز مشخص میکنه.
[me@ncis-ir playground]$ ls -l
total 8
drwxrwxr-x 2 me me 4096 2015-07-04 15:09 dir1
lrwxrwxrwx 1 me me    4 2015-07-04 15:13 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2015-07-04 14:18 dir2
lrwxrwxrwx 1 me me    3 2015-07-04 14:17 fun-sym -> fun

اغلب توزیعهای لینوکس ls رو طوری تنظیم میکنن که لینکهای شکسته رو نشون بده. توی Fedora لینکهای شکسته با متن قرمز چشمک زن! نشون داده میشن. وجود یه لینک شکسته به خودیخود خطرناک نیست ولی یه جورایی کثیف کاری محسوب میشه. اگه بخوایم با یه لینک شکسته کار کنیم، چنین چیزی میبینیم:
[me@ncis-ir playground]$ less fun-sym
fun-sym: No such file or directory

خوب بگذارین یکم دیگه تمیزکاری کنیم. لینکهای نمادین رو حذف میکنیم:
[me@ncis-ir playground]$ rm fun-sym dir1-sym
[me@ncis-ir playground]$ ls -l
total 8
drwxrwxr-x 2 me me 4096 2015-07-04 15:09 dir1
drwxrwxr-x 2 me me 4096 2015-07-04 14:18 dir2

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

درنهایت، کل زمین بازی رو حذف میکنیم. برای انجام این کار، به پوشه خانه کاربرمون برمیگردیم و از سوئیچ r- دستور rm استفاده میکنیم تا پوشه playground و محتوای داخلش رو بصورت بازگشتی حذف کنه:
[me@ncis-ir playground]$ cd
[me@ncis-ir ~]$ rm -r playground

نقل قول:ساخت لینک نمادین با GUI
مدیر فایل توی GNOME و KDE یه راه ساده و خودکار برای ساخت لینکهای نمادین در اختیارتون میگذاره. توی GNOME وقتی فایل رو میکشین و رها میکنین، کلیدهای Ctrl+Shift رو هم نگه دارین تا بجای کپی کردن، یه لینک نمادین براتون درست بشه. توی KDE وقتی فایلی رو رها میکنید، یه منوی کوچک ظاهر میشه که گزینه های کپی، جابجایی یا ایجاد لینک رو در اختیارتون میگذاره.

نکته پایانی این قسمت از آموزش
توی این قسمت خیلی کارها کردیم و اطلاعاتی که کسب کردین نیاز به زمان داره تا حسابی ملکه ذهنتون بشه. تمرینهایی که انجام دادیم رو بارها و بارها تکرار کنید تا وقتی که بطور کامل درکش کنید. آگاهی کامل و خوب از دستورات پایه دستکاری فایلها و نشانه های جایگزین خیلی مهمه. با خیال راحت زمین بازی تمرین خودتون رو با اضافه کردن فایلها و پوشه های بیشتر با کمک نشانه های جایگزین برای مشخص کردن فایلها برای عملیات مختلف، گسترش بدین. مفهوم لینکها یکم در ابتدا ممکنه گیج کننده بنظر بیاد ولی براش وقت بگذارین تا بطور کامل نحوه کارشون رو یاد بگیرین. در آینده این لینکها میتونن خیلی جاها جون شما رو نجات بدن.
تشکر شده توسط: fatima-php , __undercover , mahdirabbani , farazsahebdel , YN97 , majidganji




کاربران در حال بازدید این موضوع: 1 مهمان