۷. عملیات مربوط به فایل و پوشه
از این قسمت آموزش به بعد، هر قسمت آموزش مطالب بیشتری رو در بر میگیره، قسمتهای قبلی حجم زیادی چرت و پرت داشت. وقتی با آموزش قبلی خودم (آموزش CMD) مقایسش کردم دیدم که اون آموزش خیلی بهتر از این شده چون همه چی خلاصه و مفید بوده. پس از این قسمت، این آموزش هم روال آموزش CMD رو خواهد داشت.
نام فایلها در لینوکس
شما میتوانید از هر کاراکتری که میخواهید استفاده کنید. اما برخی از کاراکتر ها غیر مجازند چون در سیستم عامل معنای خاصی دارند. دو کارکتر کاملاً غیر مجاز، / و بایت صفر (کاراکتری که در کد اسکی مقدار ۰ را دارد یا همان نول) هستند. شما میتوانید از فاصله و نقطه و … نیز استفاده کنید. اما دقت کنید که این کار توصیه نمیشود چون مشکلاتی در زمینه ی قابلیت انتقال دارد (Portability). برای مثال در ویندوز \ یک کاراکتر غیر مجاز است در حالی که در لینوکس اینگونه نیست.
طول نام فایل بستگی به سیستم فایل پارتیشنی دارد که فایل در آن ذخیره شده، اما میتوانید آنرا ۲۵۵ کاراکتر در نظر بگیرید چون برخی سیستم فایلها مانند NTFS بیش از این مقدار را پشتیبانی نمیکنند.
تفاوت مهم دیگر هم این است که برخلاف ویندوز که نوع فایل را از پسوند فایل تشخیص میدهد، لینوکس اصلاً به پسوند توجهی نمیکند. درواقع اگر فایل متنی به نام textFile داشته باشید، برای لینوکس فرقی نمیکند که آنرا به نام textFile ذخیره کنید یا textFile.txt ، اکثر افراد ترجیح میدهند برای فایلهای متنی معمولی پسوندی انتخاب نکنند.
در لینوکس نام فایلهای مخفی با . شروع میشود. یعنی برای مخفی کردن فایل کافیست ابتدای نام آن یک . قرار دهید تا مخفی شود. و همچنین اندروید.
همانگونه که گفتیم برای اینکه در قابلیت انتقال مشکلی پیش نیاید بهتر است از کاراکتر های خاص استفاده نکنید. برای همین یک لیست از کاراکتر ها تعریف شده که اگر از آنها استفاده کنید میتوانید مطمئن باشید که نام فایل در همه ی سیستم عامل ها مورد قبول خواهد بود.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و نکته ی آخر هم اینکه نام فایل باید حتماً با یکی از این کاراکتر هاکه گفتیم شروع شود.
به چند مثال توجه کنید و سپس به کار با پوشه ها میپردازیم.
نام های زیر برای فایلها کاملاً مجازند:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اما این اسامی غیر مجاز میباشند:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دایرکتوری ها
در لینوکس دایرکتوری ها همان فایلها هستند، گرچه شما نمیتوانید تمامی عملیاتی را که روی فایلهای معمولی انجام میدادید روی دایرکتوری ها انجام دهید. بنابراین، نام فایلها از همان قوانین مربوط به نام فایلها تبعیت میکند. هر ایرکتوری میتواند شامل دایرکتوری های دیگر باشد و بدین ترتیب یک ساختار درختی تشکیل میشود. در لینوکس، دایرکتوری که بالاترین سطح را دارد / نام دارد و دایرکتوری ریشه (root) نام دارد. البته توجه داشته باشید که این root هیچ ربطی با کاربر root ندارد.
مسیر مطلق و مسیر نسبی
هر فایل با اسمی مشخص میشود که با یک / شروع میشود و با عنوان کردن تمام دایرکتوری ها به آن فایل میرسد. برای مثال، اگر فایل stdlib.h در پوشه یinclude، پوشه ی include در پوشه ی usr و پوشه ی usr در دایرکتوری ریشه (/) قرار داشته باشد، این فایل اینگونه مشخص میشود:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
چنین نامی که با / آغاز میشود، مسیر مطلق یا Absolute path نامیده میشود.
یک مسیر نسبی، همانگونه که از اسمش مشخص است، بر اساس دایرکتوری فعلی مشخص میشود. برای مثال اگر هماکنون در پوشه ی lib باشیم و بخواهیم فایل fstab در پوشه ی init را مشخص کنیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نکتهای دیگر، وجود دو میانبر خاص است که در تمام دایرکتوری ها وجود دارند (البته / استثناء است). این دو میانبر . و .. هستند.
. به معنای پوشه ی فعلی و .. به معنی پوشه ی والد پوشه ی فعلی است. اکنون چند مثال میزنیم تا این موضوع روشنتر شود.
فرض کنیم فایل test به این صورت در هارد موجود باشد:
مسیر مطلق آن به این صورت است:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر اکنون ترمینال را باز کنیم و با دستور زیر به پوشه ی ali_rnt تغییر مسیر دهیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مسیر نسبی آن به اینگونه است:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا به پوشه ی Documents تغییر مسیر میدهیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اما اگر بخواهیم به پوشه ی قبلی (Ali_rnt) برگردیم چه کنیم؟ همانگونه که گفته شد در هر دایرکتوری دو میانبر وجود دارند که یکی از آنها .. است. چون دایرکتوری ali_rnt دایرکتوری والد Documents است (دایرکتوری Documents در ali_rnt قرار دارد) پس به راحتی مینویسیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سؤالی که ممکن است پیش بیاید این است: پس میانبر . به چه درد میخورد؟
سؤال به جایی است چون به نظر کار احمقانهای میآید که بخواهیم به دایرکتوری که هماکنون در آن هستیم اشاره کنیم. اما این میانبر کاربرد های زیادی دارد. بسیاری از کاربرد های آن فراتر از سطح این آموزش اند اما یکی از آنها را مورد بررسی قرار میدهیم:
همانطور که گفته شد فرمانهای خارجی همان برنامههای اجرایی هستند. مانند nano. وقتی شما در ترمینال عبارت nano را مینویسید و اینتر را میزنید، شل، از آنجا که میداند این دستور داخلی نیست، در PATH جستجو میکند تا آنرا بیابد. خب، فرض کنید یک فایل اجرایی به نام prog داریم که در پوشه ی /home/ali_rnt قرار دارد. میخواهیم آنرا اجرا کنیم. اول به این دایرکتوری تغییر مسیر میدهیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خب، اولین ایده ای که به ذهنمان میرسد، این است که نام برنامه را تایپ کنیم. اما با تعجب میبینیم که با نوشتن prog و فشردن اینتر، شل به ما میگوید که این برنامه یافت نشد! علت چیست؟ گفتیم که شل، دستورات خارجی را در PATH (فعلاً فرض کنید که یک پوشه است) جستجو میکند. خب، فایل اجرایی prog ما که در PATH قرار ندارد. پس به شل باید بفهمانیم که prog را به جای PATH از پوشه ی فعلی اجرا کند. پس از میانبر . استفاده میکنیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
درواقع اگر میانبر . نبود، باید مینوشتیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دستورات مربوط به دایرکتوری
قرار بود که دستور cd را اینجا یاد بگیرید اما به دلایلی مجبور شدم که کمی قبل آنرا مطرح کنم. فهمیدید که این دستور دایرکتوری فعلی را به دایرکتوری داده شده تغییر میدهد.
اگر خواستید بدانید که هماکنون در چه مسیری هستید، از دستور pwd استفاده کنید. (Print Working Directory)
لیست کردن فایلها و دایرکتوری ها – ls
در محیط گرافیکی با وارد شدن به یک پوشه محتوای آنرا میبینید، اما در شل، وقتی به یک دایرکتوری تغییر مسیر میدهید محتویات آنرا برای شما نمایش نمیدهد، تا وقتی که از شل بخواهید. برای اینکار از ls استفاده میکنیم. سادهترین شکل استفاده از این فرمان، یعنی نوشتن آن بدون هیچ آرگومان و پارامتری، فقط نام فایلها را لیست میکند. جدول زیر برخی از مهمترین آپشن های این دستور را نشان میدهد:
ایجاد و حذف دایرکتوری ها
برای ایجاد یک دایرکتوری از دستور mkdir استفاده میکنیم و نام دایرکتوری را به عنوان آرگومان به آن میدهیم. مثلاً دستور زیر:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دایرکتوری Programs را در مسیر فعلی ایجاد میکند. اگر بخواهید یک دایرکتوری جدید، در یکی از دایرکتوری های موجو ایجاد کنید نیز میتوانید به این صورت عمل کنید. در این مثال فرض شده که دایرکتوری Documents وجود دارد و میخواهیم دایرکتوری testDir را درون آن بسازیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اما اگر دایرکتوری Documents هماکنون وجود نداشته باشد چه؟ به این مثال دقت کنید: میخواهیم دایرکتوری به نام new در مسیر فعلی بسازیم و داخل آن نیز دایرکتوری dir را ایجاد کنیم. خب، دستور قبلی که بررسی شد، فقط برای دایرکتوری ای که هماکنون وجود دارد جواب میدهد. میتوانیم این کار را انجام دهیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اما یک راه سادهتر هم وجود دارد و آن استفاده از گزینه ی p- است. یعنی به جای دستور بالا میتوان نوشت:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا برای حذف یک دایرکتوری، میتوانیم از rmdir استفاده کنیم. برای حذف دایرکتوری new در مثال قبل مینویسیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
الگوهای جستجوی فایل
بعضی وقتها نیاز داریم تا دستوری را برای فایلهای خاصی به کار ببریم. مثلاً همه ی فایلهایی که با حرف p شروع میشوند حذف کنیم. یکی از راههای انجام اینکار کاراکتر * است. به جای این کاراکتر هررشته ای از حروف میتواند بنشیند. برای مثال، اگر فایلهای زیر را داشته باشیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر بخواهیم نام همه ی فایلهایی که با حرف c شروع میشوند ببینیم، مینویسیم:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
به تصویر دقت کنید:
میبینید که فایل main.c نمایش داده نمیشود. البته دقت داشته باشید که فایلهای مخفی نادیده گرفته میشوند.
کاراکتر دیگر ؟ است. برخلاف ستاره که به جای آن یک رشته میتواند بنشیند، به جای علامت سؤال فقط یک کاراکتر میتواند بنشیند. همان مثال قبل:
در قسمت بعدی آموزش به ادامه ی بحث عملیات مربوط به فایلها میپردازیم.
(این قسمت آموز در
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
نیز در دسترس است)