تک دیک

واژه نامه و مجله آموزشی کامپیوتر و فناوری

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

بیایید یک زمین بازی بسازیم

از آنجایی که می‌خواهیم تعدادی دستکاری فایل واقعی انجام دهیم، بیایید یک مکان ایمن برای “بازی” با دستورات دستکاری فایل‌مان ایجاد کنیم. ابتدا ما به یک دایرکتوری برای کار نیاز داریم. ما یکی در دایرکتوری خانه خود ایجاد می‌کنیم و نام آن را playground (به معنای زمین بازی) می‌گذاریم.

ایجاد دایرکتوری ها

دستور mkdir برای ایجاد دایرکتوری استفاده می‌شود. برای ساختن دایرکتوری playground مان، ابتدا مطمئن می‌شویم که در دایرکتوری خانه خود هستیم و سپس دایرکتوری جدید را ایجاد می‌کنیم.

[me@linuxbox ~]$ cd
[me@linuxbox ~]$ mkdir playground

برای اینکه زمین بازی مان کمی جالب‌تر شود، بیایید چند دایرکتوری داخل آن به نام‌های dir1 و dir2 ایجاد کنیم. برای این منظور، دایرکتوری کاری فعلی خود را به playground تغییر می‌دهیم و mkdir دیگری را اجرا می‌کنیم.

[me@linuxbox ~]$ cd playground
[me@linuxbox playground]$ mkdir dir1 dir2

توجه داشته باشید دستور mkdir چند آرگومان قبول می‌کند که (این موضوع) به ما اجازه می‌دهد هر دو دایرکتوری را با یک دستور واحد ایجاد کنیم.

کپی کردن فایل ها

سپس، بیایید مقداری داده به زمین بازی‌مان وارد کنیم. ما این کار را با کپی کردن یک فایل انجام خواهیم داد. با استفاده از دستور cp، فایل passwd را از دایرکتوری /etc به دایرکتوری کاری فعلی کپی می‌کنیم.

[me@linuxbox playground]$ cp /etc/passwd .

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

[me@linuxbox playground]$ ls -l
total 12
drwxrwxr-x 2 me me 4096 2018-01-10 16:40 dir1
drwxrwxr-x 2 me me 4096 2018-01-10 16:40 dir2
-rw-r--r-- 1 me me 1650 2018-01-10 16:07 passwd

اکنون، فقط برای سرگرمی، بیایید کپی را با استفاده از آپشن "-v" (درازنویسی یا verbose) تکرار کنیم تا ببینیم چه می‌کند.

[me@linuxbox playground]$ cp -v /etc/passwd .
`/etc/passwd' -> `./passwd' 

دستور cp مجددا کپی را انجام داد، اما این بار یک پیام کوتاه نمایش داد که می‌گفت در حال انجام چه عملی است. توجه داشته باشید که cp نسخه اول را بدون هیچ هشداری بازنویسی کرد. باز هم این یک مورد (مرتبط با) cp است که فرض می‌کند ما می‌دانیم داریم چه کار می‌کنیم. برای دریافت هشدار، آپشن "-i" (تعاملی یا interactive) را اضافه می‌کنیم.

[me@linuxbox playground]$ cp -i /etc/passwd .
cp: overwrite `./passwd'?

پاسخ دادن به درخواست با وارد کردن y باعث می‌شود فایل بازنویسی شود، هر کاراکتر دیگری (برای مثال n) باعث می‌شود cp فایل را به حال خود رها کند.

جابجایی و تغییر نام فایل ها

اکنون، نام passwd زیاد بازیگوشانه به نظر نمی‌رسد و اینجا یک زمین بازی است پس بیایید به چیز دیگری تغییرش دهیم.

[me@linuxbox playground]$ mv passwd fun

بیایید با انتقال فایل تغییر نام داده شده خود به هر یک از دایرکتوری ها و برگرداندن مجدد آن، کمی تفریح کنیم. مورد زیر ابتدا آن را به دایرکتوری dir1 منتقل می‌کند:

[me@linuxbox playground]$ mv fun dir1

سپس مورد زیر آن را از dir1 به dir2 منتقل می‌کند:

[me@linuxbox playground]$ mv dir1/fun dir2

در پایان، مورد زیر آن را به دایرکتوری کاری فعلی برمی‌گرداند:

[me@linuxbox playground]$ mv dir2/fun .

در ادامه، بیایید تأثیر mv را روی دایرکتوری ها ببینیم. ابتدا فایل داده خود را دوباره به dir1 منتقل می‌کنیم، مشابه این:

[me@linuxbox playground]$ mv fun dir1

سپس dir1 را به dir2 منتقل می‌کنیم و آن را با ls تایید می‌کنیم.

[me@linuxbox playground]$ mv dir1 dir2
[me@linuxbox playground]$ ls -l dir2
total 4
drwxrwxr-x 2 me me 4096 2018-01-11 06:06 dir1
[me@linuxbox playground]$ ls -l dir2/dir1
total 4
-rw-r--r-- 1 me me 1650 2018-01-10 16:33 fun

توجه داشته باشید از آنجایی که dir2 پیش از این وجود داشته است، mv (دایرکتوری) dir1 را به dir2 منتقل کرد. اگر dir2 وجود نداشت، mv نام dir1 را به dir2 تغییر می‌داد. در نهایت، بیایید همه چیز را به قبل برگردانیم.

[me@linuxbox playground]$ mv dir2/dir1 .
[me@linuxbox playground]$ mv dir1/fun .

ایجاد پیوندهای سخت

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

[me@linuxbox playground]$ ln fun fun-hard
[me@linuxbox playground]$ ln fun dir1/fun-hard
[me@linuxbox playground]$ ln fun dir2/fun-hard

بنابراین اکنون ما چهار نمونه از فایل fun داریم. بیایید نگاهی به دایرکتوری زمین بازی خود بیندازیم.

[me@linuxbox playground]$ ls -l
total 16
drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir1
drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir2
-rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun
-rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun-hard

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

وقتی در مورد پیوندهای سخت فکر می‌کنیم، مفید است که تصور کنیم فایل ها از دو قسمت تشکیل شده‌اند.

  1. بخش داده شامل محتویات فایل.
  2. بخش نام که نام فایل را نگه می‌دارد.

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

دستور ls راهی برای فاش کردن این اطلاعات دارد. این (دستور) با آپشن -i فراخوانی می‌شود.

[me@linuxbox playground]$ ls -li
total 16
12353539 drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir1
12353540 drwxrwxr-x 2 me me 4096 2018-01-14 16:17 dir2
12353538 -rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun
12353538 -rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun-hard

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

ایجاد پیوندهای نمادین

پیوندهای نمادین برای غلبه بر دو عیب پیوندهای سخت ایجاد شدند.

  1. پیوندهای سخت نمی توانند دستگاه‌های فیزیکی را پوشش دهند.
  2. پیوندهای سخت نمی‌توانند به دایرکتوری‌ها ارجاع دهند، فقط (به) فایل‌ها (می‌توانند ارجاع دهند).

پیوندهای نمادین نوع ویژه‌ای از فایل هستند که حاوی یک اشاره گر متنی به فایل یا دایرکتوری هدف هستند.

ایجاد پیوندهای نمادین مشابه ایجاد پیوندهای سخت است.

[me@linuxbox playground]$ ln -s fun fun-sym
[me@linuxbox playground]$ ln -s ../fun dir1/fun-sym
[me@linuxbox playground]$ ln -s ../fun dir2/fun-sym

مثال اول کاملا سرراست (و ساده) است؛ ما به آسانی آپشن "-s" را برای ایجاد یک پیوند نمادین به جای یک پیوند سخت اضافه می‌کنیم. اما دو مورد بعدی چطور؟ به خاطر داشته باشید، زمانی که ما یک پیوند نمادین ایجاد می‌کنیم، در حال ایجاد یک توضیح متنی از مکانی هستیم که فایل هدف نسبت به پیوند نمادین دارد. اگر به خروجی ls که اینجا نمایش داده شده است نگاه کنیم، مشاهده این (موضوع) ساده‌تر است:

[me@linuxbox playground]$ ls -l dir1
total 4
-rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun-hard
lrwxrwxrwx 1 me me 6 2018-01-15 15:17 fun-sym -> ../fun

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

هنگام ایجاد پیوندهای نمادین، می‌توانیم از نام-مسیرهای مطلق مشابه آنچه اینجا نشان داده شده است:

[me@linuxbox playground]$ ln -s /home/me/playground/fun dir1/fun-sym

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

افزون بر فایل‌های معمولی، پیوندهای نمادین نیز می‌توانند به دایرکتوری‌ها ارجاع دهند.

[me@linuxbox playground]$ ln -s dir1 dir1-sym
[me@linuxbox playground]$ ls -l
total 16
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir1
lrwxrwxrwx 1 me me 4 2018-01-16 14:45 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir2
-rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun
-rw-r--r-- 4 me me 1650 2018-01-10 16:33 fun-hard
lrwxrwxrwx 1 me me 3 2018-01-15 15:15 fun-sym -> fun

حذف فایل ها و دایرکتوری ها

همانطور که پیشتر توضیح دادیم، از دستور rm برای حذف فایل ها و دایرکتوری ها استفاده می‌شود. ما می‌خواهیم از این (دستور) اندکی برای تمیز کردن زمین بازی خود استفاده کنیم. ابتدا بیایید یکی از پیوندهای سخت‌مان را حذف کنیم.

[me@linuxbox playground]$ rm fun-hard
[me@linuxbox playground]$ ls -l
total 12
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir1
lrwxrwxrwx 1 me me 4 2018-01-16 14:45 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir2
-rw-r--r-- 3 me me 1650 2018-01-10 16:33 fun
lrwxrwxrwx 1 me me 3 2018-01-15 15:15 fun-sym -> fun 

که مطابق انتظار عمل کرد. فایل fun-hard از بین رفته است و همانطور که در فیلد دوم لیستینگ دایرکتوری مشخص شده، تعداد پیوندهای نشان داده شده برای fun از چهار به سه کاهش یافته است. سپس، ما فایل fun را حذف می‌کنیم، و فقط برای لذت، آپشن -i را برای نمایش آنچه انجام می‌دهد اضافه می‌کنیم.

[me@linuxbox playground]$ rm -i fun
rm: remove regular file `fun'?

y را در پرامپت وارد کنید و فایل حذف می‌شود. اما بیایید اکنون نگاهی به خروجی ls بیندازیم. توجه کردید چه اتفاقی برای fun-sym افتاد؟ از آنجایی که این یک پیوند نمادین است که به یک فایلِ اکنون ناموجود اشاره می‌کند، پیوند خراب است.

[me@linuxbox playground]$ ls -l
total 8
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir1
lrwxrwxrwx 1 me me 4 2018-01-16 14:45 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir2
lrwxrwxrwx 1 me me 3 2018-01-15 15:15 fun-sym -> fun

اغلب توزیع‌های لینوکس ls را برای نمایش پیوندهای شکسته پیکربندی می‌کنند. وجود یک پیوند شکسته به خودی خود خطرناک نیست، اما به نسبت (نوعی) بی‌نظمی محسوب می‌شود. اگر بخواهیم از یک پیوند شکسته استفاده کنیم چنین چیزی را خواهیم دید:

[me@linuxbox playground]$ less fun-sym
fun-sym: No such file or directory

اجازه دهید کمی تمیزکاری کنیم. ما در اینجا پیوندهای نمادین را حذف می‌کنیم:

[me@linuxbox playground]$ rm fun-sym dir1-sym
[me@linuxbox playground]$ ls -l
total 8
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir1
drwxrwxr-x 2 me me 4096 2018-01-15 15:17 dir2

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

در پایان، ما زمین بازی‌مان را حذف می‌کنیم. برای انجام این کار، به دایرکتوری خانه خود باز می‌گردیم و از rm با آپشن بازگشتی (-r) برای حذف زمین بازی و تمام محتویاتش، از جمله زیردایرکتوری‌های آن استفاده می‌کنیم.

[me@linuxbox playground]$ cd
[me@linuxbox ~]$ rm -r playground

متن بالا بخشی از ترجمه کتاب The Linux Command Line (به فارسی: خط فرمان لینوکس) نوشته William Shotts است که نسخه اصلی آن از طریق وبسایت رسمی کتاب (https://linuxcommand.org) قابل دسترسی است. (فهرست مطالب کتاب خط فرمان لینوکس).

امیرحسین شهسواری

عاشق دنیای رایانه و فناوری به خصوص برنامه نویسی هستم؛ یادگرفتن و البته یاد دادن چیزای جالبی که یاد گرفتم باعث خوشحالیم میشه و از اولویت‌های اصلی زندگیم به حساب میاد. از مدیریت و نوشتن در تک دیک هم واقعا لذت می‌برم :)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *