فشرده سازی در لینوکس
نگارش یافته توسط رضا بهروزی
امروزه حتی با وجودهاردها و دستگاههای ذخیره سازی با حجم زیاد , فشرده سازی همچنان یکی از موارد مهم در همه سیستم عاملها محسوب میشود , برخی از مزایای فشرده سازی عبارت است از :
کاهش حجم اشغالی , راحتی در انتقال , راحتی در به اشتراک گذاری , افزایش سرعت انتقال ( تصور کنید که بخواهید 1000 فایل یک مگابایتی در مقایسه با یک فایل 1 گیگابایتی جا به جا کنید).
معمولترین ابزارهای فشرده سازی در لینوکس gzip , bzip2 و zip میباشد که در بین کاربران عادی zip محبوبیت و کاربرد بیشتری دارد ولی در دنیای لینوکس 2 ابزار دیگر کاربرد و مقبولیت بیشتری دارند.
خروجی پسوند هر کدام از ابزارهای بالا به شرح زیر میباشد :
bzip2=bz2
gzip=gz
zip=zip
شاید در ذهن شما این سوال آمده است که "ما اغلب با پسوندهایی نظیر tar.gz و tar.bz2 روبرو هستیم , پس جایگاه و کاربرد tar چیست؟"
در پاسخ به این سوال باید گفت که tar ابزار فشرده سازی محسوب نمیشود و هیچ گونه فشرده سازی برای ما انجام نمیدهد بلکه ابزاری جهت تهیه پشتیبان و آرشیو است.tar در واقع یک ابزار کمکی برای gzip و bzip2 در امر فشرده سازی محسوب میشود از آنجائیکه این 2 ابزار قادر به فشرده سازی چندین فایل و دایرکتوری در یک فایل واحد نمیباشند , در واقع این ابزارها برای هر فایل , فایل فشرده شده جداگانه میسازند در صورتیکه tar امکان گرد هم آوردن چندین فایل و دایرکتوری در یک فایل را به آسانی در اختیار ما قرار میدهد.
نصب ابزارهای مورد نیاز در صورت لزوم :
معمولا ابزارهای tar و gzip در اکثریت لینوکسها بطور پیش فرض نصب میباشند.
نصب در دبین :
apt-get install bzip2 zip unzip
نصب در ردهت :
yum install bzip2 zip unzip
استفاده از ابزار zip و unzip :
zip بر خلاف دو ابزار دیگر که فقط قابلیت فشرده سازی را دارند , امکان تهیه آرشیو هم داراست و نیازی به ابزارهای کمکی دیگر ندارد.
فشرده سازی با استفاده از zip :
حالت معمول فشرده سازی با zip ; در این مثال "*" نشان دهنده همه فایلهای موجود در دایرکتوری جاری میباشد , شما میتوانید آدرس فایل و دایرکتوریهای مختلف را بجای آن وارد کنید :
PersianAdmins:~# zip padmins.zip *
adding: ali/ (stored 0%)
adding: file1.txt (stored 0%)
adding: file2.txt (deflated 50%)
PersianAdmins:~#
در مثال بالا فایلها و دایرکتوریهای واقع در زیردایرکتوریها فشرده نمیشوند و اصطلاحا برگشتی(recursively) عمل نمیکند , برای حل این مشکل از گزینه r- همراه با zip استفاده میکنیم :
PersianAdmins:~# zip -r padmins.zip *
adding: ali/ (stored 0%)
adding: ali/navid/ (stored 0%)
adding: ali/navid/reza (stored 0%)
adding: file1.txt (stored 0%)
adding: file2.txt (deflated 50%)
PersianAdmins:~#
برای اینکه فایلهای فشرده شده را رمزگذاری کنیم به 2 صورت میتوان عمل کرد :
1-رمز پرسیده خواهد شد
PersianAdmins:~# zip -r padmins.zip * -e
Enter password:
Verify password:
adding: ali/ (stored 0%)
adding: ali/navid/ (stored 0%)
adding: ali/navid/reza (stored 0%)
adding: file1.txt (stored 0%)
adding: file2.txt (deflated 50%)
PersianAdmins:~#
2- رمز مورد نظر را همزمان وارد میکنیم
PersianAdmins:~# zip -r -P www.admins.ir padmins.zip *
adding: ali/ (stored 0%)
adding: ali/navid/ (stored 0%)
adding: ali/navid/reza (stored 0%)
adding: file1.txt (stored 0%)
adding: file2.txt (deflated 50%)
PersianAdmins:~#
خارج کردن از حالت فشرده با استفاده از دستور unzip :
اگر در زمان باز کزدن فایل zip برخی از فایلها وحود داشته باشند در مورد جایگزنی آنها از ما سوال خواهد پرسید :
PersianAdmins:~# unzip padmins.zip
Archive: padmins.zip
[padmins.zip] ali/ password:
replace ali/navid/reza? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
extracting: ali/navid/reza
replace file1.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace file2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
inflating: file2.txt
PersianAdmins:~#
در غیر اینصورت سوالی پرسیده نخواهد شد :
PersianAdmins:~# unzip padmins.zip
Archive: padmins.zip
[padmins.zip] ali/ password:
creating: ali/
creating: ali/navid/
extracting: ali/navid/reza
extracting: file1.txt
inflating: file2.txt
PersianAdmins:~#
باز کردن فایل zip از حالت فشرده در محل دیگری :
PersianAdmins:~# unzip padmins.zip -d /padmins/
Archive: padmins.zip
[padmins.zip] ali/ password:
creating: /padmins/ali/
creating: /padmins/ali/navid/
extracting: /padmins/ali/navid/reza
extracting: /padmins/file1.txt
inflating: /padmins/file2.txt
PersianAdmins:~#
خارج کردن یک فایل خاص :
PersianAdmins:~# ls test/
PersianAdmins:~# unzip padmins.zip file1.txt -d test/
Archive: padmins.zip
extracting: test/file1.txt
PersianAdmins:~# ls test/
file1.txt
PersianAdmins:~#
بدست آوردن اطلاعاتی در مورد فایلها و دایرکتوریهای موجود در فایل zip :
PersianAdmins:~# unzip -v padmins.zip
Archive: padmins.zip
Length Method Size Ratio Date Time CRC-32 Name
-------- ------ ------- ----- ---- ---- ------ ----
0 Stored 0 0% 07-18-08 04:08 00000000 ali/
0 Stored 0 0% 07-18-08 04:23 00000000 ali/navid/
0 Stored 0 0% 07-18-08 04:08 00000000 ali/navid/reza
0 Stored 0 0% 07-18-08 03:53 00000000 file1.txt
12 Defl:N 6 50% 07-18-08 03:54 f2b1e508 file2.txt
-------- ------- --- -------
12 6 50% 5 files
PersianAdmins:~#
بدست آوردن لیست فایلها و دایرکتوریهای موجود در فایل zip :
PersianAdmins:~# unzip -l padmins.zip
Archive: padmins.zip
Length Date Time Name
-------- ---- ---- ----
0 07-18-08 04:08 ali/
0 07-18-08 04:23 ali/navid/
0 07-18-08 04:08 ali/navid/reza
0 07-18-08 03:53 file1.txt
12 07-18-08 03:54 file2.txt
-------- -------
12 5 files
PersianAdmins:~#
اطمینان از سالم بودن فایل zip :
PersianAdmins:~# unzip -t padmins.zip
Archive: padmins.zip
[padmins.zip] ali/ password:
testing: ali/ OK
testing: ali/navid/ OK
testing: ali/navid/reza OK
testing: file1.txt OK
testing: file2.txt OK
No errors detected in compressed data of padmins.zip.
PersianAdmins:~#
استفاده از ابزار gzip :
فشرده سازی یک فایل :
PersianAdmins:~# ls
file1.txt
PersianAdmins:~# gzip file1.txt
PersianAdmins:~# ls
file1.txt.gz
PersianAdmins:~#
همانطور که مشاهده میکنید فایل اصلی بواسطه تبدیل شدنش به فایل فشرده از بین میرود , برای اینکه فایل اصلی را بهمراه فایل فشرده داشته باشیم , بدین ترتیب عمل میکنیم :
PersianAdmins:~# ls
file1.txt
PersianAdmins:~# gzip -c file1.txt > file1.txt.gz
PersianAdmins:~# ls
file1.txt file1.txt.gz
PersianAdmins:~#
می توانید همزمان آدرس چند فایل را وارد کنید :
PersianAdmins:~# ls
file1.txt file2.txt
PersianAdmins:~# gzip file1.txt file2.txt
PersianAdmins:~# ls
file1.txt.gz file2.txt.gz
PersianAdmins:~#
همانطور که مشاهده میکنید هر فایل بطور جداگانه فشرده شده است.
استفاده از tar بهمراه gzip این امکان را به ما میدهد تا همه فایلها را در یک فایل فشرده کنیم و همچنین اصل فایلها دست نخورده باقی ماند.
به چند روش میتوان از این 2 ابزار در کنار یکدیگر استفاده کرد :
1. ابتدا یک فایل آرشیو با tar ایجاد کنیم و سپس با ابزار gzip آن یک فایل را فشرده کنیم :
tar cvf padmins.tar file1.txt file2.txt test/
gzip padmins.tar
همانطور که در خط اول قابل مشاهده میباشد میتوان همزمان آدرس چندین فایل و داریکتوری را داد.
2. یک فایل آرشیو ایجاد و همزمان خروجی را برای gzip ارسال کنیم :
tar cvf padmins.tar file1.txt file2.txt test/ | gzip
3. سادهترین روش با استفاده از دستور tar در یک مرحله :
tar cvfz padmins.tar.gz file1.txt file2.txt test/
نکته :
برای اطمینان از اینکه فایل فشرده شده سالم باشد , این دستور را اجرا میکنیم :
gzip -tv padmins.tar.gz
باز کردن فایلهای فشرده gz یا tar.gz :
فایلهای فشرده شده توسط gzip را به 2 طریق میتوان از حالت فشرده خارج کرد :
1-استفاده از دستور gzip -d
PersianAdmins:~# ls
file1.txt.gz
PersianAdmins:~# gzip -d file1.txt.gz
PersianAdmins:~# ls
file1.txt
PersianAdmins:~#
2-استفاده از ابزار gunzip
PersianAdmins:~# ls
file1.txt.gz
PersianAdmins:~# gunzip file1.txt.gz
PersianAdmins:~# ls
file1.txt
PersianAdmins:~#
برای اینکه فایلهای فشرده توسط tar و gzip را ازحالت فشرده خارج کنیم 3 راه پیش رو داریم :
1. در دو مرحله , ابتدا فایل را از حالت فشرده خارج کنیم و سپس از حالت آرشیو
gzip -d padmins.tar.gz
tar xvf padmins.tar
or
gunzip padmins.tar.gz
tar xvf padmins.tar
2. هم زمان که با gzip از حالت فشرده خارج میکنیم , خروجی را به tar ارسال میکنیم :
gzip -dc tar xvf padmins.tar.gz | tar -x
3. سادهترین و بهترین روش در یک مرحله و با دستور tar :
tar xvfz padmins.tar.gz
استفاده از ابزار bzip2 :
شیوه استفاده از این ابزار کاملا مشابه gzip میباشد.
فشرده سازی یک فایل :
PersianAdmins:~# ls
file1.txt
PersianAdmins:~# bzip2 file1.txt
PersianAdmins:~# ls
file1.txt.bz2
PersianAdmins:~#
همانطور که مشاهده میکنید فایل اصلی بواسطه تبدیل شدنش به فایل فشرده از بین میرود , برای اینکه فایل اصلی را بهمراه فایل فشرده داشته باشیم , بدین ترتیب عمل میکنیم :
PersianAdmins:~# ls
file1.txt
PersianAdmins:~# bzip2 -c file1.txt > file1.txt.bz2
PersianAdmins:~# ls
file1.txt file1.txt.bz2
PersianAdmins:~#
می توانید همزمان آدرس چند فایل را وارد کنید :
PersianAdmins:~# ls
file1.txt file2.txt
PersianAdmins:~# bzip2 file1.txt file2.txt
PersianAdmins:~# ls
file1.txt.bz2 file2.txt.bz2
PersianAdmins:~#
همانطور که مشاهده میکنید هر فایل بطور جداگانه فشرده شده است.
استفاده از tar بهمراه bzip2 این امکان را به ما میدهد تا همه فایلها را در یک فایل فشرده کنیم و همچنین اصل فایلها دست نخورده باقی ماند.
به چند روش میتوان از این 2 ابزار در کنار یکدیگر استفاده کرد :
1. ابتدا یک فایل آرشیو با tar ایجاد کنیم و سپس با ابزار bzip2 آن یک فایل را فشرده کنیم :
tar cvf padmins.tar file1.txt file2.txt test/
bzip2 padmins.tar
همانطور که در خط اول قابل مشاهده میباشد میتواین همزمان آدرس چندین فایل و داریکتوری را بدهیم.
2. یک فایل آرشیو ایجاد و همزمان خروجی را برای bzip2 ارسال کنیم :
tar cvf padmins.tar file1.txt file2.txt test/ | bzip2
3. سادهترین روش با استفاده از دستور tar در یک مرحله :
tar cvfj padmins.tar.bz2 file1.txt file2.txt test/
نکته :
برای اطمینان از اینکه فایل فشرده شده سالم باشد , این دستور را اجرا میکنیم :
bzip2 -tv padmins.tar.bz2
باز کردن فایلهای فشرده bz2 یا tar.bz2 :
فایلهای فشرده شده توسط bzip2 را به 2 طریق میتوان از حالت فشرده خارج کرد :
1-استفاده از دستور bzip2 -d
PersianAdmins:~# ls
file1.txt.gz
PersianAdmins:~# bzip2 -d file1.txt.gz
PersianAdmins:~# ls
file1.txt
PersianAdmins:~#
2-استفاده از ابزار bunzip2
PersianAdmins:~# ls
file1.txt.gz
PersianAdmins:~# bunzip2 file1.txt.gz
PersianAdmins:~# ls
file1.txt
PersianAdmins:~#
برای اینکه فایلهای فشرده توسط tar و bzip2 را ازحالت فشرده خارج کنیم 3 راه پیش رو داریم :
1. در دو مرحله , ابتدا فایل را از حالت فشرده خارج کنیم و سپس از حالت آرشیو
bzip2 -d padmins.tar.gz
tar xvf padmins.tar
or
bunzip2 padmins.tar.gz
tar xvf padmins.tar
2. هم زمان که با bzip2 از حالت فشرده خارج میکنیم , خروجی را به tar ارسال میکنیم :
bzip2 -dc tar xvf padmins.tar.gz | tar -x
3. سادهترین و بهترین روش در یک مرحله و با دستور tar :
tar xvfj padmins.tar.gz
نکته :
وقتی که از دستور tar استفاده میکنیم برای آنکه فایل در محلی دیگر از حالت فشرده خارج شود بدین ترتیب میتوان عمل کرد :
tar xvfz padmins.tar.gz -C /path/to/extract/
با استفاده از tar و گزینه u- میتوان فایل آرشیو را بروز کرد ولی این کار برای فایلهای آرشیوی فشرده شده قابل انجام نیست.
نکته مهم :
سطوح مختلفی برای فشرده سازی وجود دارد , این سطوح با اعداد 0 الی 9 نشان داده میشوند.هر چه اعداد بزرگتر میشود , فشرده سازی بیشتری صورت میگیرد.در سطح 0 هیچ گونه فشرده سازی صورت نمیگیرد و همانند tar عمل میکند.با بالاتر رفتن سطح فشرده سازی میزان استفاده از منابع سیستم بیشتر شده و همچنین زمان آن هم بالاتر میرود.
سطح فشرده سازی پیش فرض 6 میباشد که ما میتوانیم بر حسب نیاز این سطوح را تغییر دهیم , کافیست در زمان استفاده از دستورات فشرده سازی مثلا برای استفاده از سطح 8 گزینه 8- را اضافه کنید.