> For the complete documentation index, see [llms.txt](https://sh.howtocode.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sh.howtocode.dev/3.0.0.part3intro/3.6.0.archiving-and-backup/3.6.2.archiving-data.md).

# ডাটা আর্কাইভিং

কম্প্রেসিং এর সাথে আরো একটি গুরুত্বপূর্ণ কাজ হল আর্কাইভিং (archiving) করা। এর মাধ্যমে অনেক ফাইল মিলে একটি বড় ফাইল তৈরী করা হয়। সিস্টেম ব্যাকাপে এটি বহুল ব্যবহৃত একটি উপায়। এবার আমরা দুটি আর্কাইভিং টুলস সম্পর্কে জানবো:

## tar

`tar` ইউনিক্সসদৃশ্য সিস্টেমের জগতে একটি ঐতিহ্যবাহী আর্কাইভিং টুল। এর পুরো নাম, **tape archive**। অর্থাৎ যখন ম্যাগনেটিক টেপে ব্যাকআপ রাখা হত তখন এর উৎপত্তি। এখনো এটি কার্যকর পদ্ধতি। আমরা তাই প্রায়ই `.tar`, `.tgz` বা `.tar.gz` এক্সটেনশনের ফাইল দেখি। প্রথমটি সাধারণ আর্কাইভ আর বাকি দুটি কম্প্রেসড আর্কাইভ।

`tar` কমান্ডের কাঠামোটি একটু অন্যরকম:

```
tar [-]mode[options] pathname...
```

এখানে মোড বলে একটা অপশন দিতে হয় এবং তারসাথে অন্য অপশন জুড়ে থাকে। এবং অপশনগুলোর সামনে '-' চিহ্ন না দিলেও হয়। এবার আমরা গুরুত্বপূর্ণ মোডগুলো দেখি:

| মোড | কাজ                                    |
| --- | -------------------------------------- |
| c   | নতুন আর্কাইভ তৈরী করে।                 |
| x   | আর্কাইভ এক্সট্রাক্ট করে।               |
| r   | একটি আর্কাইভে আরো ফাইল যোগ করে।        |
| t   | আর্কাইভের ফাইল ও ডিরেক্টরির লিস্ট করে। |

এবার আর্কাইভিং করতে আমরা কিছু ফাইল ও ডিরেক্টরি তৈরী করি:

```
me@howtocode-pc:~$ mkdir -p playground/dir-{001..100}
me@howtocode-pc:~$ touch playground/dir-{001..100}/file-{A..Z}
```

এবার আমরা playground ডিরেক্টরির সব কন্টেন্টসহ playground.tar নামে একটি আর্কাইভ তৈরী করবো এভাবে:

```
me@howtocode-pc:~$ tar -cf playground.tar playground
```

আমরা চাইলে `-cf` কে `cf` ও লিখতে পারতাম। 'f' অপশন দিয়ে আমরা ফাইলনেম দিয়েছি।

আবার আমরা চাইলে নির্দিষ্ট কিছু ফাইল `find` দিয়ে খুঁজে বের করে আর্কাইভ করতে পারতাম এভাবে:

```
me@howtocode-pc:~$ find playground -name 'file-A' -exec tar -rf playground.tar '{}' '+'
```

এখানে আমরা 'file-A' নামের সকল ফাইল নিয়ে আর্কাইভ করেছি।

আমরা `.tgz` যুক্ত gzip কম্প্রেসড আর্কাইভ ও `.tbz` যুক্ত bzip2 কম্প্রেসড আর্কাইভ তৈরী করতে পারি এভাবে:

```
me@howtocode-pc:~$ tar -czf playground.tgz playground
me@howtocode-pc:~$ tar -cjf playground.tbz playground
```

এখানে 'z' ও 'j' অপশন যথাক্রমে `gzip` ও `bzip2` নির্দেশ করে। সেই অনুসারে আমরা আর্কাইভটিরও নাম বদলেছি।

এবার আমরা যদি চাই সকল `file-A` নামের ফাইল দিয়ে একটি `bzip2` কম্প্রেসড আর্কাইভ করবো তবে লিখতে পারি:

```
me@howtocode-pc:~$ find playground -name 'file-A' | tar -cjf playground.tbz -T -
```

এখানে দুটি বিষয় লক্ষ্যণীয়। প্রথমত আমরা `find` কমান্ডের ফলাফল পাইপ দিয়ে `tar` এ প্রবাহিত করেছি। দ্বিতীয়ত, `tar` কমান্ডের শেষৈ `-T -` ব্যবহার করেছি। `-` দিয়ে স্ট্যান্ডার্ড ইনপুট ও আউটপুট দুটোই বোঝানো যায় প্রয়োজনমত। এখানে `-T` অপশন দিয়ে আমরা বলেছি কমান্ড থেকে সরাসরি ফাইলের নাম না নিয়ে স্ট্যান্ডার্ড ইনপুট থেকে নিতে। স্ট্যান্ডার্ড ইনপুট বোঝাতে `-` এবং স্ট্যান্ডার্ড ইনপুটে আমরা `find` কমান্ড চালিত করেছিলাম। অর্থাৎ এটি ইনপুট নেবে `find` কমান্ড থেকে।

আমরা playground.tar আর্কাইভটির ফাইললিস্ট দেখতে পারি এভাবে:

```
me@howtocode-pc:~$ tar -tf playground.tar
playground/
playground/dir-051/
playground/dir-051/file-B
playground/dir-051/file-E
playground/dir-051/file-I
playground/dir-051/file-H
playground/dir-051/file-W
...
```

আরো বিস্তারিত দেখতে পারি এভাবে:

```
me@howtocode-pc:~$ tar -tvf playground.tar
drwxrwxr-x me/me 0 2015-04-03 15:39 playground/
drwxrwxr-x me/me 0 2015-04-03 14:52 playground/dir-051/
-rw-rw-r-- me/me 0 2015-04-03 15:44 playground/dir-051/file-B
-rw-rw-r-- me/me 0 2015-04-03 14:52 playground/dir-051/file-E
-rw-rw-r-- me/me 0 2015-04-03 14:52 playground/dir-051/file-I
-rw-rw-r-- me/me 0 2015-04-03 14:52 playground/dir-051/file-H
-rw-rw-r-- me/me 0 2015-04-03 14:52 playground/dir-051/file-W
...
```

আমরা এবার নতুন একটি ডিরেক্টরিতে playground.tar এক্সট্রাক্ট করবো:

```
me@howtocode-pc:~$ mkdir extracted-pg
me@howtocode-pc:~$ cd extracted-pg
me@howtocode-pc:~$ tar -xf ../playground.tar
me@howtocode-pc:~$ ls
playground/
```

আমরা extracted-pg নামে একটি ডিরেক্টরি তৈরী করেছি এবং তার মধ্যে এক্সট্রাক্ট করেছি।

আমরা চাইলে সমস্ত আর্কাইভ এক্সট্রাক্ট না করে নির্দিষ্ট এক বা একাধিক ফাইল এক্সট্রাক্ট করতে পারতাম। যেমন আমরা যদি সব `file-A` নামের ফাইলগুলো এক্সট্রাক্ট করতে চাই সেটা করতে পারি এভাবে:

```
me@howtocode-pc:~$ tar -xf ../playground.tar --wildcards 'home/me/playground/dir-*/file-A'
```

এখানে যেন আমরা পাথনমে ওয়াইল্ডকার্ড ব্যবহার করতে পারি এজন্য `--wildcards` অপশনটি ব্যবহার করেছি। এবং শেষে ওয়াইল্ডকার্ড এর মাধ্যমে সকল 'file-A' নামের ফাইলগুলো সিলেক্ট করেছি।

## zip ও unzip

zip একই সাথে কম্প্রেস ও আর্কাইভ দুটোই করে। আমরা আমাদের playground ফোল্ডারটি সব কন্টেন্টসহ zip করতে চাইলে লিখতে পারি:

```
me@howtocode-pc:~$ zip -r playground.zip playground
```

`-r` অপশন দিয়ে রিকার্সিভ বোঝানো হয়েছে।

unzip করতে আমরা লিখতে পারি:

```
me@howtocode-pc:~$ unzip playground.zip
```
