خط فرمان لینوکس – نمونههایی از دستکاری فایل
بیایید یک زمین بازی بسازیم
از آنجایی که میخواهیم تعدادی دستکاری فایل واقعی انجام دهیم، بیایید یک مکان ایمن برای “بازی” با دستورات دستکاری فایلمان ایجاد کنیم. ابتدا ما به یک دایرکتوری برای کار نیاز داریم. ما یکی در دایرکتوری خانه خود ایجاد میکنیم و نام آن را 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)، فهرست ما هیچ راهی برای اینکه مطمئن شویم فراهم نمیکند. برای حل این مشکل، کمی عمیقتر میشویم.
وقتی در مورد پیوندهای سخت فکر میکنیم، مفید است که تصور کنیم فایل ها از دو قسمت تشکیل شدهاند.
- بخش داده شامل محتویات فایل.
- بخش نام که نام فایل را نگه میدارد.
هنگامی که ما پیوندهای سخت را ایجاد میکنیم، در واقع داریم بخشهای نام اضافی ایجاد میکنیم که همگی به بخش داده یکسانی اشاره میکنند. سیستم، زنجیرهای از بلاک های دیسک را به چیزی موسوم به 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 یکسانی را به اشتراک میگذارند، که تأیید میکند آنها یک فایل هستند.
متن بالا بخشی از ترجمه کتاب The Linux Command Line (به فارسی: خط فرمان لینوکس) نوشته William Shotts است که نسخه اصلی آن از طریق وبسایت رسمی کتاب (https://linuxcommand.org) قابل دسترسی است. (فهرست مطالب کتاب خط فرمان لینوکس).