# অনুশীলন

এ পর্যায়ে আমরা এই অধ্যায়ে জানা কমান্ডগুলো একটু ব্যবহার করে দেখবো। কিন্তু আমরা চাইনা কম্পিউটারের অন্যসব তথ্য বা ফাইল ক্ষতিগ্রস্থ করতে। তাই প্রথমে হোম ডিরেক্টরিতে playground নামে একটি ডিরেক্টরি করে নিই:

```
me@howtocode-pc:~$ cd ~
me@howtocode-pc:~$ mkdir playground
```

প্রথমে **cd \~** কমান্ড দিয়ে আমরা নিশ্চিত হয়ে নিলাম আমরা হোম ডিরেক্টরিতেই আছি এবং তারপর **mkdir playground** কমান্ড দিয়ে আমরা playground নামে একটি ডিরেক্টরি বা ফোল্ডার তৈরি করলাম। আসুন, আমরা এবার playground ডিরেক্টরিতে ঢুকি এবং dir1 ও dir2 নামে দুটো ডিরেক্টরি তৈরি করি:

```
me@howtocode-pc:~$ cd playground/
me@howtocode-pc:~/playground$ mkdir dir1 dir2
```

লক্ষ্য করুন, আমরা একটি কমান্ডেই ডিরেক্টরিদুটো তৈরি করেছি।

এবার কিছু তথ্য বা ফাইল আনা যাক। আমরা /etc ডিরেক্টরি থেকে passwd ফাইলটি বর্তমান ডিরেক্টরিতে কপি করে আনি:

```
me@howtocode-pc:~/playground$ cp /etc/passwd .
```

আমরা **cp** কমান্ডটির দুটি আর্গুমেন্ট দিয়েছি। প্রথমে সোর্স আইটেম হিসেবে **/etc/passwd** অর্থাৎ রুট ডিরেক্টরিতে যে etc ডিরেক্টরি তার passwd ফাইলটি এবং শেষে ডেস্টিনেশন হিসেবে '.' চিহ্ন যা দিয়ে বর্তমান ডিরেক্টরি বুঝায়। এবার \*\*ls -l দিয়ে বর্তমান ডিরেক্টরিতে কি কি আছে বিস্তারিত দেখে নেয়া যাক:

```
me@howtocode-pc:~/playground$ ls -l
total 12
drwxrwxr-x 2 me me 4096 Sep  3 12:39 dir1
drwxrwxr-x 2 me me 4096 Sep  3 12:39 dir2
-rw-r--r-- 1 me me 2095 Sep  3 12:44 passwd
```

এবার আসুন, **cp** কমান্ডের **-v** অপশনটি(verbose) ব্যবহার করে দেখি:

```
me@howtocode-pc:~/playground$ cp -v /etc/passwd .
`/etc/passwd' -> `./passwd'
```

এবার কিন্তু কোন ফাইল কোথায় কপি করছে তা আমাদের জানিয়েছে। এবার **-i** অপশন(interactive) ব্যবহার করে দেখি:

```
me@howtocode-pc:~/playground$ cp -i /etc/passwd .
cp: overwrite `./passwd'?
```

যেহেতু আমাদের এখানে passwd নামে একটি ফাইল আগে থেকেই ছিল, **-i** অপশন ব্যবহারের ফলে আমাদের কাছে অনুমতি চাইছে ফাইলটি ওভাররাইড করা হবে কিনা। আমরা 'y' চাপলে ওভাররাইড করবে আর অন্য যেকোনোকিছু চাপলে ওভাররাইড করবে না।

এবার আমরা **mv** কমান্ডের মাধ্যমে passwd ফাইলটির নাম পরিবর্তন করে fun নাম দিই:

```
me@howtocode-pc:~/playground$ mv passwd fun
```

আসুন এবার fun নামের ফাইলটিকে সবগুলো ডিরেক্টরিতে মুভ করে আবার আগের জায়গায় ফেরত আনি। প্রথমে মুভ করি dir1 ডিরেক্টরিতে:

```
me@howtocode-pc:~/playground$ mv fun dir1
```

এবার dir1 ডিরেক্টরি থেকে fun ফাইলটি dir2 ডিরেক্টরিতে মুভ করি:

```
me@howtocode-pc:~/playground$ mv dir1/fun dir2
```

এবার dir2 থেকে বর্তমান ডিরেক্টরি অর্থাৎ ফাইলটির প্রাথমিক অবস্থানে মুভ করি:

```
me@howtocode-pc:~/playground$ mv dir2/fun .
```

এবার fun ফাইলটির একটি করে হার্ডলিঙ্ক তৈরী করা যাক বর্তমান ডিরেক্টরি ও dir1 ও dir2 ডিরেক্টরিতে:

```
me@howtocode-pc:~/playground$ ln fun fun-hard
me@howtocode-pc:~/playground$ ln fun dir1/fun-hard
me@howtocode-pc:~/playground$ ln fun dir2/fun-hard
```

এবার **ls -l** দিয়ে আমাদের playground এর বর্তমান অবস্থা জেনে নেয়া যাক:

```
me@howtocode-pc:~/playground$ ls -l
total 16
drwxrwxr-x 2 me me 4096 Sep  3 13:15 dir1
drwxrwxr-x 2 me me 4096 Sep  3 13:15 dir2
-rw-r--r-- 4 me me 2095 Sep  3 12:44 fun
-rw-r--r-- 4 me me 2095 Sep  3 12:44 fun-hard
```

লক্ষ্য করুন, ২য় কলামে fun ও fun-hard উভয়ের একই সংখ্যা অর্থাৎ 4 আছে। যার অর্থ হচ্ছে ওই ফাইলটির মোট চারটি হার্ডলিঙ্ক আছে। তাছাড়া ফাইলসাইজের জায়গায় উভয়ের সাইজ একই। তাহলে উভয়ই কি একই ফাইল? নাও হতে পারে। এটা বের করতে আরো গভীরে যেতে হবে।

যখন হারডলিঙ্কের কথা ভাবছি তখন কল্পনা করুন যে একটা ফাইলের দুটো অংশ হয়। হার্ডডিস্কে ব্লকের পর ব্লক তথ্য সাজিয়ে তথ্যের অংশ যাকে ইনোড(inode) বলে। এবং একটি নামের অংশ যা ওই ইনোডের সাথে আবদ্ধ। আমরা যখন হার্ডলিঙ্কিং করি তখন আসলে ওই ফাইলের ইনোডের জন্য আরো একটি নতুন নাম দিই। অর্থাৎ দুটি ফাইলের ইনোড একই হলে ফাইল দুটি আসলে একটিই ফাইল।

ইনোড নম্বর দেখতে **ls -l** এর সাথে **-i** অপশনটি যুক্ত করতে হয়। সংক্ষেপে **ls -li**। আসুন ব্যবহার করে দেখি:

```
me@howtocode-pc:~/playground$ ls -li
total 16
811034 drwxrwxr-x 2 me me 4096 Sep  3 13:15 dir1
811035 drwxrwxr-x 2 me me 4096 Sep  3 13:15 dir2
794647 -rw-r--r-- 4 me me 2095 Sep  3 12:44 fun
794647 -rw-r--r-- 4 me me 2095 Sep  3 12:44 fun-hard
```

এখানে প্রথম কলামে ইনোড নম্বর আছে । লক্ষ্য করুন fun এবং fun-hard উভয়ের ইনোড নম্বর একই। অর্থাৎ তারা একই ফাইল।

এবার সিমবোলিক লিঙ্ক তৈরি করা যাক। হার্ডলিঙ্কের মতই বর্তমান ডিরেক্টরিতে একটা এবং dir1 ও dir2তে একটা করে:

```
me@howtocode-pc:~/playground$ ln -s fun fun-sym
me@howtocode-pc:~/playground$ ln -s ../fun dir1/fun-sym
me@howtocode-pc:~/playground$ ln -s ../fun dir2/fun-sym
```

প্রথম কমান্ডটি হার্ডলিঙ্ক তৈরি করার মতই শুধু **-s** অপশনটি যুক্ত করা হয়েছে সিমবোলিক লিঙ্ক তৈরি করতে। কিন্তু দ্বিতীয় ও তৃতীয় কমান্ডে fun এর জায়গায় ../fun কেন? কারন dir1 বা dir2 এর সাপেক্ষে ওটাই fun ফাইলটির অবস্থান। অর্থাৎ, dir1 বা dir2 এর সাপেক্ষে fun এর রিলেটিভ পাথ ../fun

আমরা fun ফাইলটির এ্যাবসলিউট পাথ ব্যবহার করেও সিমবোলিক লিঙ্ক তৈরি করতে পারি:

```
me@howtocode-pc:~/playground$ ln -s /home/me/playground/fun dir1/fun-sym
```

আমরা চাইলে dir1 এর সিমবোলিক লিঙ্ক তৈরি করতে পারি:

```
me@howtocode-pc:~/playground$ ln -s dir1 dir1-sym
```

এবার কিছু ডিলিট করা বা মুছে ফেলা যাক। আমরা fun-hard নামের হার্ডলিঙ্কটি মুছে ফেলি প্রথমে:

```
me@howtocode-pc:~/playground$ rm fun-hard
```

এবার **ls -l** কমান্ড দিয়ে দেখি মুছে গেছে কিনা:

```
me@howtocode-pc:~/playground$ ls -l
total 12
drwxrwxr-x 2 me me 4096 Sep  3 13:55 dir1
lrwxrwxrwx 1 me me    4 Sep  3 14:07 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 Sep  3 13:56 dir2
-rw-r--r-- 3 me me 2095 Sep  3 12:44 fun
lrwxrwxrwx 1 me me    3 Sep  3 13:54 fun-sym -> fun
```

এখানে fun-hard ফাইলটি নেই, অর্থাৎ সেটি মুছে গেছে।

এবার -i অর্থাৎ ইন্টারএ্যাকটিভ অপশনসহ fun ফাইলটি মুছে ফেলার চেষ্টা করি:

```
me@howtocode-pc:~/playground$ rm -i fun
rm: remove regular file ‘fun’?
```

এবার fun ফাইলটি মোছার আগে অনুমতি চাইছে। আমরা y চেপে এন্টার দিলে ফাইলটি মুছে গেলো। এবার **ls -l** দিয়ে দেখি:

```
me@howtocode-pc:~/playground$ ls -l
total 8
drwxrwxr-x 2 me me 4096 Sep  3 13:55 dir1
lrwxrwxrwx 1 me me    4 Sep  3 14:07 dir1-sym -> dir1
drwxrwxr-x 2 me me 4096 Sep  3 13:56 dir2
lrwxrwxrwx 1 me me    3 Sep  3 13:54 fun-sym -> fun
```

fun ফাইলটি নেই। এবং হয়ত লক্ষ্য করেছেন আপনার টার্মিনালে **fun-sym -> fun** লাল অক্ষরে লেখা। যার অর্থ ওই সিমবোলিকলিঙ্কটি ভেঙে গেছে বা ব্রোকেন। মানে লিঙ্কটি আর কাজ করবে না। এবার আমরা সিমবোলিক লিঙ্কগুলো মুছে ফেলি:

```
me@howtocode-pc:~/playground$ rm dir1-sym fun-sym
```

এবার আমরা হোম ডিরেক্টরিতে যাই এবং playground ডিরেক্টরিটিকেই মুছে ফেলি:

```
me@howtocode-pc:~/playground$ cd ~
me@howtocode-pc:~/playground$ rm -r playground
```

লক্ষ্য করুন, playground ফোল্ডারের মধ্যে তখনও কিছু কন্টেন্ট ছিল তাই মুছে ফেলতে আমাদের **-r** অপশনটি ব্যবহার করতে হয়েছে।


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sh.howtocode.dev/1.0.0.part1intro/1.2.0.manipulation/1.2.7.playground.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
