فصل چهارم - دایرکتوری‌ها

از Linuxreview Wiki
پرش به: ناوبری, جستجو


این فصل به معرفی درخت دایرکتوری و همچنین نحوه‌ی دست‌کاری دایرکتوری ها میپردازد.

محتویات

[نهفتن]

مقدمات

سیستم‌های مبتنی بر یونیکس برای مدیریت دایرکتوری‌ها و فایل‌ها از ساختارهای سلسه مراتبی که به صورت یک درخت وارون پیاده سازی میشود، استفاده میکنند که ریشه‌ی(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) در یونیکس

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

  1. آدرس یابی به صورت مطلق
  2. آدرس یابی به صورت نسبی


آدرس مطلق

نشان دهنده‌ی مسیر یک فایل یا دایرکتوری با شروع از دایرکتوری ریشه میباشد. به طوری که تمام دایرکتوری‌های مابین فایل مورد نظر و ریشه نوشته میشود و در انتها نام فایل آورده میشود.
مثال:

/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

خطاهای متداولی که در استفاده از این دستور رخ می‌دهد:

  1. تلاش برای تغییر مسیر به یک فایل
  2. تلاش برای تغییر مسیر به یک دایرکتوری ناموجود
  3. تلاش برای تغییر مسیر به یک دایرکتوری که مجوز اجرا توسط کاربر را ندارد

لیست فایل‌ها و دایرکتوری‌ها


دستور 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 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)

ابزارهای شخصی
گویش‌ها
فضاهای نام
عملکردها
گشتن
کتاب‌ها
مقاله‌ها
جعبه‌ابزار