دستکاری فایلها و پوشه ها
تو این مرحله، آماده ایم که یکم کار واقعی انجام بدیم. این قسمت از آموزش به دستورات زیر اختصاص داره:
- 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 وقتی فایلی رو رها میکنید، یه منوی کوچک ظاهر میشه که گزینه های کپی، جابجایی یا ایجاد لینک رو در اختیارتون میگذاره.
نکته پایانی این قسمت از آموزش
توی این قسمت خیلی کارها کردیم و اطلاعاتی که کسب کردین نیاز به زمان داره تا حسابی ملکه ذهنتون بشه. تمرینهایی که انجام دادیم رو بارها و بارها تکرار کنید تا وقتی که بطور کامل درکش کنید. آگاهی کامل و خوب از دستورات پایه دستکاری فایلها و نشانه های جایگزین خیلی مهمه. با خیال راحت زمین بازی تمرین خودتون رو با اضافه کردن فایلها و پوشه های بیشتر با کمک نشانه های جایگزین برای مشخص کردن فایلها برای عملیات مختلف، گسترش بدین. مفهوم لینکها یکم در ابتدا ممکنه گیج کننده بنظر بیاد ولی براش وقت بگذارین تا بطور کامل نحوه کارشون رو یاد بگیرین. در آینده این لینکها میتونن خیلی جاها جون شما رو نجات بدن.