۱۳۸۷ تیر ۳۱, دوشنبه

فشرده سازی در لینوکس

امروزه حتی با وجود هاردها و دستگاههای ذخیره سازی با حجم زیاد , فشرده سازی همچنان یکی از موارد مهم در همه سیستم عامل ها محسوب می شود , برخی از مزایای فشرده سازی عبارت است از :
کاهش حجم اشغالی , راحتی در انتقال , راحتی در به اشتراک گذاری , افزایش سرعت انتقال ( تصور کنید که بخواهید 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- می توان فایل آرشیو را بروز کرد ولی این کار برای فایل های آرشیوی فشرده شده قابل انجام نیست.

۳ نظر:

نبی گفت...

بسیار مقاله جامعی بود.
دست شما درد نکنه.
اون نکته تکمیلی هم بهتره انتهای همین مقاله اضافه میکردی.
در کل مقالات لینوکس خوبی در وبلاگت نوشتی.
اگر در مورد secure کردن سرورهای لینوکس بیشتر بنویسی استفاده میکنیم.
موفق باشی

نبی گفت...

ظاهراً zip با فایلهای بزرگتر از 4 گیگ مشکل داره:
# unzip r.zip
error: Zip file too big (greater than 4294959102 bytes)
Archive: r.zip
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of r.zip or
r.zip.zip, and cannot find r.zip.ZIP, period.

نبی گفت...

البته در استفاده از علامت * باید کمی دقت داشت و اون اینکه علامت * به کارکتر . اشاره نمیکنه! یعنی اگر ابتدای فایل با . شروع شده باشه اون رو در نظر نمیگیره، مثل فایلهای .htaccess، البته در مورد شاخه های داخلی مشکلی پیش نمیاد.
مثلاً این دستور:
tar cvfz file.tar.gz *
اگر در شاخه جاری فایل .htaccess وجود داشته باشه اون رو درنظر نمیگیره.
یا مثلاً این یکی:
tar cvfz file.tar.gz target/*
فایلهای .htaccess درون شاخه target را درنظر نمیگیرد و بجای آن بایستی از این دستور استفاده بشه:
tar cvfz file.tar.gz target/


انشااله که اطلاعات غلط نداده باشم. اگر اشتباه بود تصحیح بفرمائید.
c