فصل چهارم - دایرکتوریها
این فصل به معرفی درخت دایرکتوری و همچنین نحوهی دستکاری دایرکتوری ها میپردازد.
محتویات[نهفتن] |
مقدمات
سیستمهای مبتنی بر یونیکس برای مدیریت دایرکتوریها و فایلها از
ساختارهای سلسه مراتبی که به صورت یک درخت وارون پیاده سازی میشود، استفاده
میکنند که ریشهی(root) این درخت با کاراکتر اسلش (/) مشخص میشود. و تمام
دایرکتوری ها زیر شاخههای ریشه هستند.شما میتوانید از هر زیردایرکتوری
ریشه برای ذخیره اطلاعات خود استفاده کنید. هر فایل در یک دایرکتوری و هر
دایرکتوری(به جز دایرکتوری ریشه) در یک دایرکتوری دیگر ذخیره میشود.
اشاره: این الگو متفاوت از سیستمهای مبتنی بر ویندوز یا مک است که چندین دایرکتوری(همانند cd-rom floppy drive یا هارددیسک) میتوانند در بالاترین سطح قرار داشته باشند.
تعریف: برای آشنایی با اصطلاحات دایرکتوری والد(parent directory) و دایرکتوری فرزند(subdirectories یا child) مثال زیر را در نظر بگیرید.
فرض کنید دو دایرکتوری با نامهای A و B وجود دارد به طوری که دایرکتوری A
محتوی دایرکتوری B نیز هست. در این صورت به A دایرکتوری والد و به B
فرزند یا زیردایرکتوری A میگویند.
نکته: عمق درخت شامل دایرکتوریها محدود و حداکثر ۱۰۲۴ است.
Filenames و Pathnames
در سیستمهای مبتنی بر یونیکس هر فایل و دایرکتوری دارای یک اسم میباشد.
بهعلاوه هر فایل و دایرکتوری به همراه خود، نام والدش را نیز دارد. زمانی
که نام یک فایل به همراه اسم کامل والدش آورده میشود، نتیجه pathname
نامیده میشود.
دو مثال از pathname:
/home/ranga/docs/book/ch5.txt /usr/local/bin/
همانطور که مشاهده میشود نام هر فرزند از والد خود با یک اسلش (/) جدا شده است. مجموع تمام کلمات به همراه کاراکترهای اسلش (/)، pathname نامیده میشود. آخرین کلمه در pathname نام فایل یا دایرکتوری است.
نکته ۱: نام هر فایل میتواند حداکثر تا ۲۵۵کاراکتر باشد(سیستم عامل بیشتر از این مقدار را به طور خودکار نادیده میگیرد).
نکته ۲: نام دوفایل در یک دایرکتوری نمیتواند برابر باشد. به طور مثال دو عبارت زیر نشان دهندهی دقیقا یک فایل هستند:
/home/baroon/docs/ch5.doc /home/baroon/docs/ch5.doc
نکته ۳: نام فایلها در سیستمهای مبتنی بر یونیکس حساس به بزرگی و کوچکی حروف است (بهجز در فایلسیستمهای ماکروسافتی مثل fat و ntfs). به طور مثال دو عبارت زیر، نشان دهندهی دو فایل مجزا هستند:
/home/baroon/docs/ch5.doc /home/baroon/docs/CH5.doc
که البته ممکن است در ابتدا برای کسانی که از سیستمعاملهای شرکت مایکروسافت استفاده میکنند گمراه کننده باشد.
روشهای نمایش مسیر(pathname) در یونیکس
برای دستیابی به یک فایل یا دایرکتوری باید مسیر آن مشخص باشد. در سیستمهای مبتنی بر یونیکس به دو صورت میتوان مسیر یک فایل یا دایرکتوری را مشخص کرد.
- آدرس یابی به صورت مطلق
- آدرس یابی به صورت نسبی
آدرس مطلق
نشان دهندهی مسیر یک فایل یا دایرکتوری با شروع از دایرکتوری ریشه
میباشد. به طوری که تمام دایرکتوریهای مابین فایل مورد نظر و ریشه نوشته
میشود و در انتها نام فایل آورده میشود.
مثال:
/home/baroon/work/bugs.txt
این مسیر مطلق فایل bugs.txt است که در دایرکتوری work که آن در دایرکتوری baroon و آن در home قرار دارد. اسلش ابتدای آدرس به معنی آن است که دایرکتوری home در دایرکتوری ریشه قرار دارد.
آدرس نسبی
همانند آدرس مطلق است با این تفاوت که شروع آدرس به جای دایرکتوری ریشه، دایرکتوری جاری میباشد.
مثال:
docs/ch.txt
نکته ۱: زمانی که از آدرس دهی نسبی استفاده میشود، آدرس شروع با کاراکتر اسلش شروع نمیشود. زیرا شروع آدرس با این کاراکتر نشان دهندهی آدرس دهی به روش مطلق است.
نکته ۲: برای بدست آوردن مسیر دایرکتوری جاری از دستور pwd استفاده میشود.
نکته ۳: در سیستمهای مبتنی بر یونیکس دونقطه(..) برای نشان دادن دایرکتوری والد و نقطه(.) برای نمایش دایرکتوری جاری به کار میرود.
نکته ۴: برای تبدیل مسیر نسبی به مسیر مطلق یک راه آسان وجود دارد:
استفاده از علامت نقطه (که نماد دایرکتوری جاری است) در ابتدای مسیر نسبی.
مثلاً مسیر
docs/ch5.doc
نسبی است، و مسیر
./docs/ch5.doc
مطلق است.
نکته ۵: برای اجرای فایلهای اجرایی (شامل اسکریپتها)، در صورتی که در یکی از دایرکتوریهای متغیر PATH نباشند، باید مسیر مطلق آورده شود، مثلا این صحیح نیست:
scripts/test.sh
و این صحیح است
./scripts/test.sh
مگر اینکه علامت نقطه (نماد دایرکتوری جاری) در متغیر PATH موجود باشد، که به دلایل امنیتی، در سیستمهای لینوکس بطور پیشفرض اینچنین نیست (بر خلاف ویندوز و بعضی از یونیکسهای قدیم)
مثال: با فرض مسیر جاری home/ranga/ ،سهعبارت زیر با هم برابرند:
/home/ranga/docs/ch5.doc ./docs/ch5.doc docs/ch5.doc
جابجایی بین دایرکتوریها
در شل برای تغییر یا جابجا شدن بین دایرکتوریها از دستور cd استفاده میشود.
تعیین دایرکتوری خانه
ساده ترین راه برای مشخص کردن دایرکتوری خانه(home) از استفاده از دستور cd
و بعد از آن دستور pwd است. دستور cd شما را به دایرکتوری خانه هدایت
میکند و دستور pwd مسیر آن را نمایش میدهد.
مثال:
$ cd $ pwd /home/baroon
تغییر دایرکتوری
برای این منظور میتوان از دستور cd به شکل زیر استفاده کرد(direcoty میتواند به صورت نسبی یا مطلق آدرس دهی شود):
cd directory
مثال:
$ cd /usr/local/bin $ cd ../../usr/local/bin
خطاهای متداولی که در استفاده از این دستور رخ میدهد:
- تلاش برای تغییر مسیر به یک فایل
- تلاش برای تغییر مسیر به یک دایرکتوری ناموجود
- تلاش برای تغییر مسیر به یک دایرکتوری که مجوز اجرا توسط کاربر را ندارد
لیست فایلها و دایرکتوریها
دستور ls در فصل قبل بررسی شد. در ادامه شکل جدیدتری از این دستور بررسی میشود:
$ ls [options] diradd
که در آن diradd آدرس نسبی یا مطلق یک دایرکتوری است
نکته: در صورتی که در دستور بالا به جای دایرکتوری نام یک فایل قرار گیرد، خروجی تنها نام همان فایل را چاپ میکند.
دستکاری دایرکتوریها
ایجاد یک دایرکتوری
با استفاده از دستور زیر میتوان یک دایرکتوری ایجاد کرد:
$ mkdir dirs
که dir میتواند به صورت نسبی یا مطلق آدرسدهی شود
مثال:
$ mkdir hw1 $ mkdir /tmp/test-dir $ mkdir docs pub
که در مثال اول آدرس دهی به روش نسبی، در مثال دوم آدرس مطلق و در مثال سوم دو دایرکتوری به نامهای docs و pub ایجاد میشود.
نکته: در صورتی که در هنگام آدرس دهی dir، دایرکتوریهای والد آن وجود نداشته باشند دستور منجر به بروز خطا میشود. برای جلوگیری از بروز خطا و همچنین ایجاد دایرکتوریهای والد در صورتی که موجود نباشند از آپشن p استفاده میشود.
مثال:
$ mkdir -p /tmp/edu/ch04/test1
که تمام دایرکتوریهای والد test1 را در صورت وجود ایجاد میکند.
خطاهای رایجی که در استفاده از دستور mkdir رخ میدهند:
- تلاش برای ایجاد کردن یک دایرکتوری که از قبل وجود دارد، است.
- تلاش برای ایجاد کردن یک دایرکتوری که فایلی هم نام آن موجود است.
$ mkdir /tmp/ch04 mkdir: cannot make directory '/tmp/ch04': File exists
$ ls names.txt $ mkdir docs/names mkdir: cannot make directory 'docs/names': File exists
کپی کردن دایرکتوریها
در فصل قبل با نحوهی کپی کردن فایلها آشنا شدید. و در این فصل شکل کلی کپی کردن دایرکتوری شرح داده میشود.
برای این منظور از دستور cp به شکل زیر استفاده میشود:
cp -r src des
که در آن src مسیر دایرکتوری کپی شونده است.
مثال:
$ cp -r docs/book /mnt/zip
در این مثال یک زیر دایرکتوری در zip با نام و محتوای دایرکتوری book ایجاد میشود.
همچنین میتوان چند دایرکتوری را به طور همزمان در یک مقصد کپی کرد.
مثال:
$ cp -r docs/book docs/school work/src /mnt/zip
نکته: وقتی از آپشن r استفاده میکنید مقصد میتواند هم فایل و هم دایرکتوری باشد.
مثال:
$ cp -r .profile docs/book .kshrc doc/names work/src /mnt/jaz
نکته: در صورتی که در دایرکتوری مقصد، یک زیر دایرکتوری همنام با مبدا باشد، عمل کپی منجر به بروز خطا خواهد شد.
مثال:
$ cp -r docs /mnt/zip/backup cp: cannot create directory '/mnt/zip/backup': File exists
منتقل کردن دایرکتوریها
مشابه آنچه در فصل قبل دیدید شکل کلی دستور mv به صورت زیر است:
mv src des
با این تفاوت که src و des در اینجا دایرکتوری هستند.
چند مثال:
$ mv /home/ranga/names /tmp $ mv docs/ work/ $ mv work/docs . $ mv docs/names /tmp/names.txt
که در مثال آخر دایرکتوری علاوه بر جابجا شدن تغییر نام نیز میابد.
همچنین src میتواند شامل چند دایرکتوری یا فایل نیز باشد.
مثال:
$ mv work/ docs/ .profile pub/
نکته: در این حالت امکان تغییر نام و جابجایی به طور همزمان وجود ندارد.
خطاهای رایجی که در استفاده از دستور mv رخ میدهند:
- دایرکتوری مقصد وجود نداشته باشد
- مقصد یک فایل باشد
- سیستمفایل مبدا و مقصد متفاوت باشد
مثالها:
$ mv .profile docs pub /mnt/jaz/backup mv: when moving multiple files, last argument must be a directory
با این فرض که tmp و home به صورت جداگانه و با سیستمفایلهای متفاوت باشند:
$ mv /tmp/ch01 /home/ranga/docs mv: cannot move '/tmp/ch01' across filesystems: Not a regular file
برای این منظور میتوان از دستور cp استفاده کرد و سپس با استفاده از دستور rm فایل مبدا را حذف کرد.
حذف یک دایرکتوری
برای این منظور میتوان از دستور زیر استفاده کرد:
rmdir directories rm -r directories
دستور اول شکل ایمنتر دستور حذف است به این دلیل کهتنها دایرکتوریهایی که محتوای آنها خالی هست پاک میشود.
دستور دوم دایرکتوری را به همراه تمام محتوای آن پاک میکند.
توجه: در شکل دوم، برگرداندن اطلاعات پاک شده بسیار سخت است.
چند مثال:
$ rm -r ch01/ test1.txt ch01-old.txt ch02/ $ rm -r ch01/ $ rmdir ch01 ch02 ch03
که در شکل سوم در صورتی دایرکتوریهای ch01 ch02 ch03 خالی باشند حذف میشوند.
خطاهای رایجی که در استفاده از دستور rmdir ممکن است رخ دهد:
- تلاش برای حذف یک فایل با استفاده از rmdir
- تلاش برای حذف یک دایرکتوری که خالی نیست
- تلاش برای حذف یک دایرکتوری که مجوز نوشتن توسط کاربر را ندارد
مثال:
$ rmdir docs rmdir: docs: Directory not empty
$ rmdir names rmdir: names: Not a directory
تنها خطای رایجی که در استفاده از دستور rm -r ممکن است رخ دهد وجود نداشتن فایل یا دایرکتوری مورد نظر، یا نداشتن مجوز است.
مثال:
$ rm -r midterm_answers rm: midterm_answers: No such file or directory
Eman ۱۵ فوریهٔ ۲۰۱۲، ساعت ۱۱:۵۱ (UTC)
بارون ۱۶ مارس ۲۰۱۲، ساعت ۱۷:۰۹ (UTC)