زیپ و آنزیپ کردن فایل ها با ترمینال لینوکس – از صفر تا صد


فایلهای زیپ (ZIP) یک آرشیو جهانی هستند که به طور گستردهای روی سیستمهای ویندوز، macOS و حتی لینوکس استفاده میشوند. شما میتوانید با استفاده از برخی دستورهای ترمینال لینوکس اقدام به زیپ و آنزیپ کردن فایل ها بکنید. در این راهنما نیز به همین مسئله یعنی نحوه زیپ و آنزیپ کردن فایلها با ترمینال لینوکس خواهیم پرداخت.
قالب آرشیو فشرده ZIP
به لطف سلطه قالب Zip در اقلیم ویندوز، فایلهای ZIP احتمالاً رایجترین شکل از آرشیو فشرده در دنیا هستند. با این که فایلهای tar.gz. و tar.bz2 نیز در لینوکس رایج هستند، اما کاربران ویندوز احتمالاً فایلهای فشرده خود را به صورت Zip برای شما ارسال میکنند. اگر میخواهید برخی فایلها را فشردهسازی کرده و برای کاربران ویندوز ارسال کنید، قالب Zip سادهترین و تطبیقپذیرترین گزینه برای همه افراد خواهد بود.
زیپ، آنزیپ و دیگر ابزارهای کاربردی
احتمالاً میدانید که لینوکس و سیستمهای عامل شِبه Unix مانند macOS ابزارهایی دارند که امکان ایجاد فایلهای Zip و استخراج فایلها از آنها را فراهم میکنند. این ابزارها به ترتیب زیپ (zip) و آنزیپ (unzip) نام دارند. البته یک خانواده کامل از ابزارهای مرتبط مانند zipcloak ،zipdetails ،zipsplit و zipinfo نیز وجود دارند.
ما برخی توزیعهای لینوکس را بررسی کردیم تا ببینیم آیا همه آنها شامل این ابزارها در نسخه نصبی استاندارد هستند یا نه. همه این ابزارها در اوبونتو 19.04، 18.10 و 18.04 وجود داشتند. همچنین در توزیع Manjaro 18.04 نیز ابزارهای یاد شده حاضر بودند. توزیع Fedora 29 شامل ابزارهای zip و unzip است، اما هیچ کدام از ابزارهای دیگر را شامل نمیشود. این حالت در مورد توزیع CentOS نیز صدق میکند.
برای نصب ابزارهای مفقود روی Fedora 29 از دستور زیر استفاده کنید:
sudo dnf install perl-IO-Compress
برای نصب اجزای مفقود روی CentOS 7 از دستور زیر استفاده کنید:
sudo yum install perl-IO-Compress
اگر هر کدام از ابزارهای Zip در یک توزیع لینوکس که در بخش قبل اشاره شد، وجود نداشته باشند میتوانید از ابزارهای مدیریت پکیجهای آن توزیع برای نصب بسته و ابزار مورد نیاز خود استفاده کنید.
ایجاد فایل زیپ با دستور zip
برای ایجاد یک فایل ZIP باید به دستور zip اعلام کنیم که نام فایل آرشیو چیست و کدام فایلها باید در آن قرار بگیرند. لزومی وجود ندارد که پسوند zip. را برای نام آرشیو ذکر کنید، اما انجام چنین کاری نیز لطمهای وارد نمیکند.
برای ایجاد فایلی به نام source_code.zip که شامل همه فایلهای کد منبع C و فایلهای هدر در دایرکتوری جاری باشد باید از دستور زیر استفاده کنید:
zip source_code *.c *.h
هر فایل زمانی که اضافه شود، فهرستبندی خواهد شد. نام فایل و مقدار فشردهسازی انجام یافته برای آن فایل نیز نمایش داده میشود.
اگر به آرشیو ZIP جدید نگاه کنید، میبینید که پسوند فایل zip. به صورت خودکار از سوی ابزار zip اضافه شده است:
ls -l source_code.zip
اگر خروجی ابزار zip را در زمان ایجاد فایل ZIP مشاهده نمیکنید، از گزینه q- استفاده کنید:
zip -q source_code *.c *.h
گنجاندن دایرکتوریها در فایلهای ZIP
برای گنجاندن دایرکتوریهای فرعی در فایل ZIP باید از گزینه r- به معنی «بازگشتی» (recursive) استفاده کنید و نام دایرکتوری فرعی را در خط فرمان ذکر کنید. برای ایجاد یک فایل ZIP مانند قبل و گنجاندن دایرکتوری فرعی از این دستور استفاده کنید:
zip -r -q source_code archive/ *.c *.h
برای این که وقتی افراد میخواهند فایلهای فشرده شما را از آرشیو استخراج کنند، با مشکل مواجه نشوند و در زمان استخراج همه فایلها روی سیستم در یک دایرکتوری به صورت منظم قرار گیرند، بهتر است فایلهایی را که میخواهیم آرشیو کنیم، همواره درون یک دایرکتوری قرار دهیم.
در دستور زیر قصد داریم دایرکتوری work و همه دایرکتوریهای فرعی آن را آرشیو کنیم. توجه داشته باشید که این دستور از دایرکتوری والد پوشه work صادر میشود.
zip -r -q source_code work/
تنظیم سطح فشردهسازی
شما میتوانید میزان فشردهسازی اعمال شده روی فایلها را نیز در زمان افزودن آنها به آرشیو ZIP تعیین کنید. بازه قابل تعریف از 0 تا 9 است. 0 به معنی عدم فشردهسازی است، هر چه این عدد بالاتر برود، میزان فشردهسازی افزایش یافته و به طور طبیعی زمان مورد نیز برای انجام این کار نیز افزایش مییابد. برای فایلهای ZIP با اندازه متوسط این تفاوت زمانی چندان قابل توجه نخواهد بود. بدین ترتیب در مورد اغلب فایلها، سطح فشردهسازی پیشفرض (سطح 6) احتمالاً به قدر کافی مناسب خواهد بود.
برای اینکه ابزار zip از یک سطح خاصی از فشردهسازی استفاده کند، باید یک عدد به همراه (-) به صورت زیر به عنوان گزینه به خط فرمان ارسال کنید:
zip -0 -r -q source_code work/
سطح فشردهسازی پیشفرض 6 است. بنابراین نیازی به ذکر عدد -6 نیست، اما اگر چنین کاری را هم انجام بدهید، ایرادی وارد نخواهد کرد.
zip -r -q source_code work/
سطح بیشینه فشردهسازی برابر با سطح 9 است.
zip -9 -r -q source_code work/
با احتساب فایلها و دایرکتوریهای منتخبی که ما آرشیو کردیم، تفاوت بین عدم فشردهسازی (سطح 0) و فشردهسازی پیشفرض (سطح 6)، به مقدار 400 کیلوبایت بوده است. تفاوت بین فشردهسازی سطح 6 و بالاترین سطح یعنی 9 نیز صرفاً برابر با 4 کیلوبایت بوده است.
شاید این مقدار به نظر شما زیاد نباشد؛ اما برای آرشیوهایی که شامل صدها یا حتی هزاران فایل هستند، مقدار کمی فشردهسازی بیشتر برای هر فایل موجب صرفهجویی زیادی در فضا خواهد شد.
افزودن رمز عبور به فایلهای زیپ
افزودن رمز عبور به فایلهای ZIP کار آسانی است. کافی است از گزینه e– استفاده کنید که اختصاری برای عبارت «encrypt» (رمزگذاری) است. بدین ترتیب از شما یک رمز عبور پرسیده میشود و در ادامه باید آن را مجدداً وارد کنید تا تأیید شود.
zip -e -r -q source_code work/
آنزیپ کردن با دستور unzip
برای استخراج فایلها از یک فایل ZIP باید از دستور unzip استفاده کنیم و نام فایل ZIP را مورد اشاره قرار دهیم. توجه کنید که باید پسوند zip. را نیز ذکر کنید.
unzip source_code.zip
زمانی که فایلها استخراج شدند، در پنجره ترمینال فهرستبندی میشوند:
فایلهای ZIP شامل جزییات مالکیت فایلها نیستند. همه این فایلهایی که استخراج میشوند دارای مالکیتی هستند که برای فرد استخراجکننده تنظیم شده است.
دستور unzip نیز مانند دستور zip یک گزینه q- دارد، که زمانی استفاده میشود که نیازی به دیدن فهرستبندی فایلهای استخراج شده نداشته باشید.
unzip -q source_code.zip
استخراج فایلها به یک دایرکتوری هدف
برای این که فایلها در یک دایرکتوری مشخص استخراج شوند، از گزینه d– استفاده کنید که اختصاری برای عبارت «دایرکتوری» (directory) است. با ذکر این گزینه باید مسیر آن دایرکتوری را که میخواهید آرشیو در آن استخراج شود را نیز معین کنید.
unzip -q source_code.zip -d./development
استخراج فایلهای زیپ که با رمز عبور محافظت میشوند
اگر یک فایل ZIP با یک رمز عبور ایجاد شده باشد، ابزار unzip از شما میخواهد که رمز عبور آن را وارد کنید. اگر رمز عبور صحیحی وارد نکنید، ابزار unzip فایلها را استخراج نخواهد کرد.
unzip -q source_code.zip
اگر برایتان مهم نیست که رمزهای عبور شما از سوی دیگران دیده شود، یا در سابقه دستورها نگهداری شود میتوانید رمز عبور را در خط فرمان با استفاده از گزینه P- ذکر کنید. در این مورد به بزرگ بودن حرف P دقت کنید.
unzip -P fifty.treacle.cutlass -q source_code.zip
استثنا کردن برخی فایلها
اگر نمیخواهید یک فایل خاص یا گروهی از فایلها را استخراج کنید، از گزینه x- استفاده کنید که اختصاری برای عبارت «استخراج» (exctract) است. در این مثال ما میخواهیم همه فایلها را به جز آنهایی که دارای پسوند h. هستند از آرشیو استخراج کنیم. بنابراین از دستور زیر استفاده میکنیم:
unzip -q source_code.zip -x *.h
بازنویسی فایلها
فرض کنید، یک آرشیو را استخراج کردید، اما چند مورد از فایلهای استخراج شده را به اشتباه حذف کردهاید.
یک راهحل سریع این است که فایلها را یک بار دیگر استخراج کنید. اما اگر تلاش کنید فایل ZIP را در همان دایرکتوری قبلی استخراج کنید ابزار unzip به شما هشدار میدهد که آیا میخواهید فایلها را بازنویسی کنید. این هشدار یکی از مقادیر زیر را میپذیرد (به جز r برای تغییر نام، بقیه موارد به کوچکی یا بزرگی حروف حساس هستند):
- y: بله، این فایل را بازنویسی کن.
- n: نه، این فایل را بازنویسی نکن.
- A: بله، همه فایلها را بازنویسی کن.
- N: نه، هیچ یک از فایلها را بازنویسی نکن.
- r: تغییر نام، این فایل را استخراج کن، اما یک نام جدید به آن بده. این نام جدید از شما پرسیده میشود.
برای این که ابزار unzip را ملزم به استخراج همه فایلها بکنیم، میتوانیم از گزینه o- استفاده کنیم.
unzip -o -q source_code.zip
بهینهترین روش برای جایگزینی فایلهای مفقود این است که unzip تنها آن فایلهایی را از آرشیو استخراج کند که در دایرکتوری مقصد نیستند. به این منظور باید از گزینه n- استفاده کنیم.
unzip -n source_code.zip
بررسی محتوای داخل یک فایل ZIP
دیدن فهرست فایلهای داخل یک آرشیو ZIP پیش از استخراج آن در اغلب موارد راهگشا است. این کار از طریق استفاده از گزینه l- میسر است. این دستور از طرق less به صورت Pipe اجرا میشود تا خروجی قابل مدیریتی به نمایش درآید.
unzip -l source_code.zip | less
خروجی دستور فوق دایرکتوریها و فایلهای درون فایل ZIP را نمایش میدهد و همچنین طول آنها و زمان و تاریخ افزودن به آرشیو قابل مشاهده هستند. در نهایت با ارسال کاراکتر q میتوانیم از less خارج شویم.
روشهای دیگری نیز برای مشاهده محتوای داخلی یک فایل آرشیو ZIP وجود دارند که انواع مختلفی از اطلاعات را ارائه میکنند و در ادامه آنها را بررسی میکنیم.
افزودن یک رمز عبور با دستور zipcloak
اگر یک فایل ZIP را ایجاد کرده و فراموش کرده باشید، رمز عبوری برای آن تعیین کنید چه راهحلی وجود دارد؟
در این موارد میتوان با استفاده از دستور zipcloak به سرعت یک رمز عبور به فایل اضافه کرد. کافی است نام فایل ZIP را در خط فرمان ارسال کنید تا رمز عبور از شما پرسیده شود. پس از تأیید مجدد، رمز عبور روی فایل فعال میشود.
zipcloak source_code.zip
دیدن جزییات فایل با دستور zipdetails
دستور zipdetails نیز اطلاعات زیادی در مورد فایل ZIP به نمایش میگذارد. تنها روش معقول برای مدیریت مقدار خروجی این دستور آن است که آن را از طریق less به صورت Pipe اجرا کنیم:
zipdetails source_code.zip | less
توجه کنید که این اطلاعات شامل نامهای فایلها میشوند و حتی اگر فایل ZIP دارای رمز عبور باشد باز نام فایلها نمایش پیدا میکند. این نوع اطلاعات درون فایل ZIP به صورت فراداده ذخیره میشوند و بخشی از دادههای رمزنگاریشده نیستند.
جستجو درون فایل با دستور zipgrep
دستور zipgrep امکان جستجو درون فایلهای یک فایل ZIP را فراهم میسازد. در مثال زیر میخواهیم بدانیم که کدام فایلها درون فایل ZIP دارای متنی به صورت keyval.h هستند.
zipgrep keyval.h source_code.zip
چنان که میبینیم، فایلهای slang.c و getval.c شامل رشته keyval.h هستند. همچنین میبینیم که دو کپی از هر یک از این فایلها در دایرکتوریهای مختلف فایل ZIP قرار دارند.
مشاهده اطلاعات با دستور zipinfo
دستور zipinfo روش دیگری برای بررسی فایلهای درون آرشیو ZIP در اختیار ما قرار میدهد. همانند روش قبلی، باید خروجی را از طریق less به صورت pipe عرضه کنیم:
zipinfo source_code.zip | less
خروجی دستور فوق از چپ به راست شامل اطلاعات زیر است:
- دسترسیهای فایل.
- نسخه ابزاری که برای ایجاد فایل ZIP استفاده شده است.
- اندازه فایل اصلی.
- توصیفی از فایل (در ادامه توضیح خواهیم داد).
- روش فشردهسازی (در این مورد deflation است).
- دادهها و زمان.
- نام فایل و دایرکتوری (در صورت وجود).
توصیف فایل از دو کاراکتر تشکیل یافته است. کاراکتر نخست یک b یا t است که به ترتیب نشاندهنده باینری یا متنی بودن فایل است. اگر یک حرف بزرگ باشد به این معنی است که فایل رمزنگاریشده است. کاراکتر دوم میتواند یکی از چهار کاراکتر زیر باشد. این کاراکتر نشان میدهد که نوع فراداده درون این فایل چیست. عدم وجود کاراکتر به معنی «هدر محلی بسط یافته» (extended local header)، یک «فیلد اضافی» (extra field) یا هر دوی آنها است:
- -: اگر هیچ کام از موارد فوق نباشد کاراکتر خط تیره نمایش مییابد.
- I: در صورتی که یک هدر محلی بسط یافته وجود داشته باشد، اما فیلد اضافی موجود نباشد.
- x: اگر هدر محلی بسط موجود یافته باشد، اما فیلد اضافی موجود نباشد.
- X: اگر هر دو مورد هدر محلی بسط یافته و فیلد اضافی موجود باشد.
افراز فایل با دستور zipsplit
اگر لازم باشد یک فایل ZIP را به کس دیگری ارسال کنید، اما مشکل محدودیت اندازه یا مشکلاتی در زمینه انتقال فایل وجود داشته باشد، میتوانید از دستور zipsplit برای افراز کردن فایل ZIP اصلی به مجموعهای از فایلهای ZIP کوچکتر بکنید.
گزینه n- (اندازه) امکان تعیین اندازه بیشینه برای هر یک از فایلهای ZIP جدید را میدهد. در این مثال، ما میخواهیم فایل source_code.zip را افراز کنیم. ما نمیخواهیم هیچ یک از فایلهای ZIP حاصل بزرگتر از 100 کیلوبایت (102400 بایت) باشند.
zipsplit -n 102400 source_code.zip
اندازهای که انتخاب میشود، نمیتواند کمتر از اندازه هر یک از فایلها در آرشیو ZIP باشد.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای لینوکس (Linux)
- مجموعه آموزشهای مهارتهای کاربردی کامپیوتر (ICDL)
- چگونه فایل ها را از آرشیوهای مرسوم مانند RAR ،۷z و ZIP استخراج کنیم؟
- تفاوت میان فرمتهای فشردهسازی Zip و RAR چیست؟
- چگونه فایل ها را در PHP به صورت Zip یا Unzip درآوریم؟ — به زبان ساده
==
-bash: zip: command not found
بسیار عالی بود! ممنون.
سلام
بسیار ساده بیان شده بود
سوالی که پیش اومد اگر بخواییم یک پوشه یا فایل رو با حجم دلخواه به تعدادی پارت تبدیل کنیم از چه دستوری استفاده مبشه؟
ینی فایل یک گیگ رو مثلا 10 فایل صد مگی بکنیم