آرشیو کردن فایلها
وظیفه رایج مدیریت فایلها در کنار فشردهسازی، آرشیو کردن فایلها است.
آرشیو کردن، پروسه جمعآوری فایلها و بستهبندی آنها در قالب یک فایل بزرگ است. آرشیو کردن، اغلب بهعنوان بخشی از بکاپهای سیستم انجام میشود. همچنین زمانی که داده قدیمی از سیستمی به یک حافظه بلندمدت منتقل میشود، صورت میپذیرد.
فرمان tar
در دنیای نرمافزاری یونیکس، برنامه tar ابزار کلاسیکی برای آرشیو کردن فایلها بوده که مخفف عبارت Tape Archive میباشد که ریشه خود را از ابزاری برای ساختن نوارهای بکاپ میگیرد.
در حالی که هنوز وظیفه سنتی خود، یعنی بکاپ بر روی نوار (Tape) را انجام میدهد، بر روی دیگر دیوایسهای ذخیرهسازی نیز سازگار است. گاهی فایلهایی با پسوند tar و tgz را میبینیم که به ترتیب نشاندهنده یک آرشیو ساده tar میتواند از گروهی از فایلهای جدا، یک یا چند شاخه سلسلهمراتبی یا مخلوط از هر دو تشکیل شده باشد.
ترکیب خط فرمان آن به شکل زیر است:
tar mode[options] pathname...
این در حالی است که Mode یکی از حالتهای عملیاتی است که در جدول زیر نشان داده شده است:
| وضعیت | توضیحات |
|---|---|
| c | ایجاد یک آرشیو از یک لیست از فایلها یا پوشهها |
| x | استخراج یک آرشیو |
| r | پیوست نامها مسیر تعیین شده به پایان یک آرشیو |
| t | لیست کردن محتویات یک آرشیو |
فرمان tar از راهی عجیب برای بیان گزینهها استفاده مینماید، پس برای نشان دادن نحوه عملکرد آن نیاز به مثالی داریم. اول محیط کاری playground خود را (که در آموزشهای قبلی بدان اشاره شد) مجددا ایجاد میکنیم:
[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}
در ادامه از کل محیط playground یک آرشیو tar ایجاد میکنیم:
[me@linuxbox ~]$ tar cf playground.tar playground
این فرمان، یک آرشیو tar با نام playground.tar ایجاد میکند که حاوی کل دایرکتوری playground میباشد. میتوانیم ببینیم که حالت c و گزینه f که بهمنظور اختصاص نام آرشیو tar استفاده میشود، با هم ترکیب شدهاند و نیازی نیست به ابتدای کاراکتر – را اضافه کنیم. هر چند حالت (Mode) بایستی همیشه ابتدا و قبل از هر گزینه دیگری آورده شود.
بهمنظور لیست کردن محتوای آرشیو، میتوانیم از فرمان زیر استفاده کنیم:
[me@linuxbox ~]$ tar tf playground.tar
برای دست یافتن به لیستی با جزئیات بیشتر، میتوانیم گزینه v (سرنام واژه verbose) را استفاده کنیم:
[me@linuxbox ~]$ tar tvf playground.tar
در ادامه playground را در یک موقعیت جدید استخراج میکنیم. این کار را ابتدا با ایجاد یک دایرکتوری جدید با نام foo و سپس تغییر دایرکتوری و استخراج فایل آرشیو انجام میدهیم:
[me@linuxbox ~]$ mkdir foo [me@linuxbox ~]$ cd foo [me@linuxbox foo]$ tar xf ../playground.tar [me@linuxbox foo]$ ls playground
اگر محتوای دایرکتوری home/me/playground را باز کنیم، میبینیم که آرشیو با موفقیت نصب شده است. با وجود اینکه هشداری وجود ندارد؛ فایلها و دایرکتوریهای استخراج شده از آرشیو، بهجای مالکیت اصلی خود، مالکیت کاربری را میگیرند که عمل بازیابی را انجام داده است، مگر آنکه عمل بازیابی را از طریق کاربر ارشد (Super User) انجام داده باشید.
رفتار جالب توجه دیگر tar شیوه نگهداری نامهای مسیر (pathname) آرشیوها است. نامهای مسیر پیشفرض، بهجای مسیرهای مطلق، مسیرهای نسبی است. برنامه tar این کار را از طریق حذف اسلشهای ابتدایی از نام مسیر، هنگام ایجاد آرشیو انجام میدهد.
بهمنظور شرح آن، آرشیو خود را مجددا ایجاد میکنیم، این بار یک نام مسیر مطلق به آن اختصاص میدهیم:
[me@linuxbox foo]$ cd [me@linuxbox ~]$ tar cf playground2.tar ~/playground
توجه داشته باشید که ~/playground هنگام فشار دادن کلید Enter به آدرس /home/me/playground بسط پیدا میکند؛ در نتیجه یک نام مسیر مطلق را دریافت خواهیم کرد. سپس این آرشیو را همانند قبل استخراج میکنیم:
[me@linuxbox ~]$ cd foo [me@linuxbox foo]$ tar xf ../playground2.tar [me@linuxbox foo]$ ls home playground [me@linuxbox foo]$ ls home me [me@linuxbox foo]$ ls home/me playground
در اینجا میبینیم که زمانی که آرشیو دوم را استخراج کردیم، دایرکتوری home/me/playground را نسبت به دایرکتوری که در آن هستیم (نه نسبت به دایرکتوری ~/foo)، ایجاد میکند. این شیوه کار، کمی عجیب به نظر میرسد ولی از این نظر که به آنها اجازه میدهد تا در موقعیتهای اصلی خود اشتخراج شوند، مفید خواهد بود. تکرار کردن این تمرین با اضافه کردن گزینه v تصویر واضحتری به شما خواهد داد.
یک مثال فرضی را در نظر بگیرید. تصور کنید میخواهیم دایرکتوری home و محتویات آن را از سیستمی به سیستم دیگر منتقل کنیم و برای این کار، میتوان از یک درایو USB استفاده کرد. فرض کنید که Disk1 نام BigDisk دارد. پس از آن که بر روی سیستم مدرن لینوکس خود، درایو بهصورت خودکار در مسیر /media سوار (mount) شد؛ میتوانیم برای ایجاد آرشیو tar از این فرمان استفاده کنیم:
[me@linuxbox ~]$ sudo tar cf /media/BigDisk/home.tar /home
پس از آنکه فایل tar نوشته شد، درایو USB را برداشته و به سیستم دیگر خود متصل میکنیم. مجدد USB بر روی مسیر /media/BigDisk سوار (mount) میشود.
برای استخراج آرشیو چنین خواهیم کرد:
[me@linuxbox2 ~]$ cd / [me@linuxbox2 /]$ sudo tar xf /media/BigDisk/home.tar
نکته قابل توجه این است که ما بایستی، ابتدا بایستی دایرکتوری را به / تغییر دهیم تا استخراج نسبت به دایرکتوری root انجام شود؛ چرا که نامهای مسیر (pathnameها) در داخل آرشیو، نسبی هستند.
هنگامی که یک آرشیو را استخراج میکنید، ممکن استآنچه که استخراج یافته را محدود کنید. بهعنوان مثال اگر بخواهیم فایلی را از یک آرشیو استخراج کنیم، میتوانیم به این صورت عمل کنیم:
tar xf archive.tar pathname
با اضافه کردن نام مسیر (pathname) به فرمان، مطمئن میشویم که tar فقط فایلهای اختصاص یافته را بازیابی میکند. چندین نام مسیر را میتوانیم اختصاص دهیم. به یاد داشته باشید که نام مسیر، بایستی نام مسیر کامل و نسبی باشد. زمانی که نامهای مسیر را اختصاص میدهید، بهصورت معمول wildcardها پشتیبانی نمیشوند. هرچند نسخه tar GNU (نسخهای که در اکثر توزیعهای لینوکسی یافت میشود، گزینه –wildcards را پشتیبانی میکند.
مثالی با استفاده از فایل قبلی playground.tar
[me@linuxbox ~]$ cd foo [me@linuxbox foo]$ tar xf ../playground2.tar --wildcards 'home/me/playground/ dir-*/file-A'
این فرمان، فقط فایلهایی که با نامهای مسیر دارای wildcard بهصورت dir-* هستند را استخراج میکند.
غالبا tar در اتصال با فرمان find بهمنظور ایجاد آرشیوها استفاده میشود. در این مثال، از فرمان find بهمنظور ایجاد مجموعهای از فایلها برای قرار دادن آن در یک آرشیو استفاده میکنیم:
[me@linuxbox ~]$ find playground -name 'file-A' -exec tar rf playground.tar '{
}' '+'
در اینجا از find برای تطبیق دادن تمامی فایلهای با نام file-A استفاده میکنیم؛ سپس با استفاده از –exec فرمان tar را در mode (r) ضمیمه بهکار میگیریم تا فایلهای منطبق در آرشیو playground.tar را اضافه کنیم.
استفاده از tar به همراه find روش خوبی برای ایجاد بکاپهای شمارشی افزایشی یک دایرکتوری یا کل سیستم است. با استفاده از find (بهمنظور منطبق کردن فایلهای جدید نسبت به یک فایل timestamp) میتوانیم آرشیوی که فقط حاوی فایلهای جدید نسبت به آخرین آرشیو است را ایجاد نماییم (با فرض اینکه فایل timestamp درست پس از ایجاد آرشیو، بهروز شود).
همچنین tar میتواند از خروجی و ورودیهای استاندارد نیز استفاده کند. این یک مثال مفهومی است:
[me@linuxbox foo]$ cd [me@linuxbox ~]$ find playground -name 'file-A' | tar cf - --files-from=- | gzip > playground.tgz
در این مثال، از فرمان find برای ایجاد لیستی از فایلهای منطبق استفاده کردیم و سپس آنها را به داخل tar پایپ میکنیم. گزینه -files–from (که همچنین ممکن است بهعنوان –T نیز تعیین شود)، موجب میشود تا tar لیست نامهای مسیر را بهجای خط فرمان از یک فایل بخواند. در آخر، آرشیوی که بهوسیله tar ایجاد شده در داخل gzip پایپ شده تا یک آرشیو فشرده playground.tgz ایجاد شود. پسوند tgz پسوند قراردادی است که به فشردههای gzip فایلهای tar داده میشود. همچنین گاهی اوقات پسوند tar.tgz نیز استفاده میشود.
درحالیکه از برنامه خارجی gzip بهمنظور ایجاد فایلهای آرشیو استفاده میکنیم، نسخههای مدرن tar GNU از فشردهسازی gzip و bzip2 بهصورت مستقیم با استفاده از گزینههای z و j پشتیبانی میکنند. با استفاده از مثال قبلی بهعنوان یک الگو میتوانیم آن را به شیوه زیر ساده کنیم:
[me@linuxbox ~]$ find playground -name 'file-A' | tar czf playground.tgz -T -
اگر میخواهیم یک آرشیو فشرده bzip2 ایجاد کنیم، میتوانیم به این صورت عمل کنیم:
[me@linuxbox ~]$ find playground -name 'file-A' | tar cjf playground.tbz -T -
با تغییر ساده گزینههای فشردهسازی از z به j (و تغییر پسوند فایل خروجی به tbz که نشاندهنده یک فایل فشرده bzip2 است) فشردهسازی bzip2 را فعال کردهایم.
یک استفاده جالب دیگر از خروجی و ورودی استاندارد، بههمراه فرمان tar مستلزم انتقال فایلها بین سیستمها بر روی شبکه است. تصور کنید که دو ماشین در حال اجرای یونیکس مجهز به tar و ssh داریم. در چنین سناریویی میتوانیم دایرکتوری را از یک سیستم ریموت (با نام remote-sys) به سیستم local خود انتقال دهیم:
[me@linuxbox ~]$ mkdir remote-stuff [me@linuxbox ~]$ cd remote-stuff [me@linuxbox remote-stuff]$ ssh remote-sys 'tar cf - Documents' | tar xf - me@remote-sys's password: [me@linuxbox remote-stuff]$ ls Documents
در اینجا قادر به کپی یک دایرکتوری با نام Documents از سیستم ریموت remote-sys به دایرکتوری تحت عنوان remote-stuff بر روی سیستم local بودیم.
درواقع، ابتدا برنامه tar را با استفاده از ssh بر روی سیستم ریموت اجرا کردیم. اگر به خاطر داشته باشید، ssh شما را قادر میسازد تا فرمانی را بهصورت ریموت بر روی کامپیوتر در شبکه اجرا نموده و نتیجه را در سیستم local مشاهده کنید. خروجی استاندارد ایجاد شده بر روی سیستم ریموت به سیستم local فرستاده شده و برای ما نمایش داده میشود.
ما میتوانیم از این ویژگی با ایجاد یک آرشیو (c mode) و ارسال خروجی استاندارد، بهجای یک فایل (گزینه f با آرگومان Dash) سود برده، در نتیجه آرشیو را در تانل رمزگذاری شدهای که توسط ssh فراهم گشته، به ماشین local انتقال دهیم.
فرمان zip (بسته و فایلهای فشرده)
فرمان zip ابزاری برای فشردهسازی و آرشیو کردن است. فرمت فایلی که توسط برنامه استفاده میشود، برای کاربران ویندوز آشناست. هر چند که در لینوکس gzip فرمان فشردهسازی اول و bzip2 فرمان دوم است، اما کاربران لینوکس اکثرا از zip بهجای فشردهسازی و آرشیو، برای انتقال فایلها بین سیستمهای ویندوز استفاده میکنند.
در سادهترین شکل استفاده آن zip به این صورت بهکار گرفته میشود:
zip options zipfile file...
بهعنوان مثال، برای ایجاد یک آرشیو zip از playground خود بهصورت زیر عمل میکنیم:
[me@linuxbox ~]$ zip -r playground.zip playground
به این دلیل که گزینه –r که سرنام واژه recursion (بهمعنای بازگشت) را اضافه کردیم، فقط دایرکتوری playground (نه محتوای درونش) ذخیره میشود. گرچه اضافه شدن پسوند zip بهصورت خودکار انجام میشود، اما بهمنظور شفافیت، پسوند zip را اضافه خواهیم کرد.
در طی ایجاد آرشیو zip، فرمان zip بهصورت عادی مجموعهای از پیامها را بهصورت زیر نمایش میدهد:
adding: playground/dir-020/file-Z (stored 0%) adding: playground/dir-020/file-Y (stored 0%) adding: playground/dir-020/file-X (stored 0%) adding: playground/dir-087/ (stored 0%) adding: playground/dir-087/file-S (stored 0%)
این پیامها وضعیت هر فایل اضافه شده به آرشیو را نشان میدهد. فرمان zip فایلها را با استفاده از دو شیوه ذخیره و به آرشیو اضافه میکند: یا فایلی را بدو فشردهسازی همانطور که در اینجا نشان داده شده ذخیره میکند، و یا فایل را فشرده کرده و ذخیره میکند.
مقدار عددی که پس از شیوه ذخیرهسازی، نمایش داده میشود، نشاندهنده میزان فشردهسازی بهدست آمده است. از آنجایی که دایرکتوری playgroundحاوی فایلهای خالی است، هیچ نوع فشردهسازی بر روی محتوا صورت نمیپذیرد و این مقدار عددی صفر میباشد. استخراج محتوای یک فایل zip، زمانیکه از برنامه unzip استفاده کنیم، بسیار ساده است:
[me@linuxbox ~]$ cd foo [me@linuxbox foo]$ unzip ../playground.zip
نکتهای در رابطه با zip (بر خلاف tar) وجود دارد که اگر آرشیوی موجود باشد، بهجای آنکه بر روی فایل قبلی کپی شود، آن را بهروزرسانی میکند. بدین معنا که آرشیو موجود حفظ میشود ولی فایلهای جدید اضافه شده و فایلهای تکراری جایگزین میشوند.
فایلها ممکن است که بهصورت انتخابی از یک آرشیو zip لیست و استخراج شوند:
[me@linuxbox ~]$ unzip -l playground.zip playground/dir-087/file-Z Archive: ./playground.zip Length Date Time Name -------- ---- ---- ---- 0 10-05-12 09:25 playground/dir-087/file-Z -------- ------- 0 1 file [me@linuxbox ~]$ cd foo [me@linuxbox foo]$ unzip ../playground.zip playground/dir-087/file-Z Archive: ../playground.zip replace playground/dir-087/file-Z? [y]es, [n]o, [A]ll, [N]one, [r]ename: y extracting: playground/dir-087/file-Z
استفاده از گزینه –l باعث میشود که فرمان unzip تنها محتوای آرشیو را لیست کند، بدون آنکه استخراج فایل انجام شود. اگر هیچ فایلی اختصاص نیافته باشد، فرمان unzip همه فایلهای آرشیو را لیست خواهد کرد. گزینه –v را میتوان بهمنظور طولانینویسی لیست اضافه کرد.
قابل ذکر است، زمانی که استخراج آرشیوی با تصادم فایل موجود مواجه میشود، پیش از آن از کاربر مربوطه برای تایید جایگزینی سوالی پرسیده خواهد شد که بهوسیله y و n میتوان به آن پاسخ داد.
فرمان zip به مانند tar میتواند از خروجی و ورودی استاندارد استفاده کند. همچنین میتوان لیستی از اسامی فایلها را که به درون یک فایل zip (با استفاده از گزینه @) پایپ کرد.
[me@linuxbox foo]$ cd [me@linuxbox ~]$ find playground -name "file-A" | zip -@ file-A.zip
در اینجا با استفاده از find لیستی از فایلهای مطابق با تست -name “file-A” ایجاد کردیم و سپس آن را به درون یک فایل زیپ، پایپ کردیم و به موجب آن آرشیوی با نام file-A.zip (که حاوی محتوای فایلهای انتخاب شده است)، ایجاد میشود.
همچنین فرمان zip از نوشتن خروجی خود در خروجی استاندارد پشتیبانی میکند، ولی استفاده از آن محدود است؛ چرا که برنامههای اندکی میتوانند از خروجی آن استفاده کنند. متاسفانه، فرمان unzip خروجی استاندارد را قبول نمیکند.
این کار موجب میشود که zip و unzip نتوانند مانند tar در کپی فایل در شبکه با هم استفاده شوند.
با این حال zip قادر است ورودی استاندارد را قبول کند، پس میتوان از آن بهمنظور فشردهسازی خروجی دیگر برنامهها استفاده کرد:
[me@linuxbox ~]$ ls -l /etc/ | zip ls-etc.zip - adding: - (deflated 80%)
در این مثال، خروجی ls را به درون فایل zip پایپ کردیم. فرمان unzip زمانی خروجی خود اجازه میدهد تا به ورودی استاندارد ارسال گردد، که گزینه –p تعیین شده باشد:
[me@linuxbox ~]$ unzip -p ls-etc.zip | lessمنبع: لینوکسسیزن نوشته فرشید نوتاش حقیقت
درباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش جفنگ استفاده میکند. درباره چگونگی پردازش دادههای دیدگاه خود بیشتر بدانید.
دیدگاهتان را بنویسید