Съществуват много причини за архивиране: събрани и архивирани файлове спестяват място на твърдия диск и трафик при изпращането им през интернет. Под Linux има както графични приложения (както File Roller под GNOME или Ark под KDE), така и такива работещи в терминала, които поддържат архивирането и разархивирането на различните типове формати. Тази статия ще ви представи конзолните приложения и как да работите с тях (команди, параметри), за да „опаковате“ и „разопаковате“ различни архиви.
Добре gzip-нат
Програмата Gzip (GNU Zip) и стандартния „опаковчик“ под Linux. Gzip архивира обикновени файлове; инструмента не може да архивира цели директории. Най-обикновеното извикване на инструмента е:
gzip файл1
По този начин от файл1 създава файла файл1.gz. Gzip заменя оригиналния файл с едно неговия компресиран вариант с окончания .gz. Особеностите на файла като права, дата на създаване и редакция остават запазени в пакета. Ако не ви харесва окончанието на файла, можете да го промените с параметъра -S (Suffix). Ето и как ще изглежда командата:
gzip -S .z снимка.bmp
Резултата ще бъде снимка.bmp.z
Големината на създадените архиви зависи най-вече от разпределението на информацията в оригиналните файлове. В случай, че във файла има много повтарящи се части, то тогава този файл ще бъде доста добре архивиран. Архивирането на вече компресирани файлове като MP3 или JPG, няма да доведе до особен резултат. За пример ще покажа разликата между два файла .bmp и .jpg:
>$ ls -l total 1320 -rw-r--r-- 1 vladi vladi 1254214 2010-04-20 14:58 zhbackground.bmp -rw------- 1 vladi vladi 82261 2010-04-20 14:59 zhbackground.jpg $ ls -l total 1000 -rw-r--r-- 1 vladi vladi 928469 2010-04-20 14:58 zhbackground.bmp.gz -rw------- 1 vladi vladi 82151 2010-04-20 14:59 zhbackground.jpg.gz
Освен това можете да повлиаете големината на файла с фактора на компресиране от 1 до 9, където gzip -1 компресира файла сравнително по-бързо в сравнение с gzip -9, но скоростта е за сметка на качеството. Стандартната стойност за gzip е -6. Ако желаете да промените стойността по подразбиране ще трябва да добавите следния ред във файла ~/.bashrc – export GZIP="9".
За да разархивирате вече архивиран файл можете да използвате инструмента gunzip или gzip -d. В случай, че в директорията съществува файл със същото име, приложението ще ви попита дали искате да презапишете съществуващия файл:
$ gunzip zhbackground.jpg.gz gzip: zhbackground.jpg already exists; do you wish to overwrite (y or n)?
Ако в този момент отговорите с [N], Gzip ще прекъсне процеса и файла няма да бъде разархивиран. Ако намирате въпроса за сигурност ненужен, можете да включите параметъра -f (от английски „force“ = „наложително/насилствено“). Този параметър има и друг ефект: Gzip по подразбиране отказва да архивира(компресира) символични връзки (Symlink) на файла. Ако използвате параметъра -f върху символична връзка ще бъде архивиран файла, към който сочи връзката и ще зададе като име на архива името на символичната връзка. При „разопаковането“, обаче, ще получите като резултат нормален файл, а не връзка.
Не се налага разархивирането на архивирани файлове, на пример HOWTO файловете от /usr/share/doc/, за да ги чете с приложения като less или more. Става по-бързо когато към gzip добавите параметъра -c (пиши в stdout) и свържете изхода на командата с четящото приложение, за да е по-ясно командата изглежда така:
gzip -dc /usr/share/doc/iptables/README.Debian.gz | less
Горния пример можете да бъде съкратен изключително много ако използвате zless файл.gz. Зад тази команда стои един малък скрипт, който реално прави почти същото, както горната по-дълга команда. Аналогично на zless съществуват и други модификации на Linux инструменти като zcat и zgrep.
По-бърз и по-добър: bzip2
Програмата Bzip2 използва друг алгоритъм за компресиране и по този начин архивира обикновените файлове значително по-добре, както можете да видите от примера:
$ ls -l total 3032 -rw-r--r-- 1 vladi vladi 1254214 2010-04-20 15:22 zhbackground.bmp -rw-r--r-- 1 vladi vladi 812743 2010-04-20 15:23 zhbackground.bmp.bz2 -rw-r--r-- 1 vladi vladi 928469 2010-04-20 15:22 zhbackground.bmp.gz
Освен това bzip2 разполага с така наречения Rcovery-режим: при компресиране, инструмента разлага файла на отделни блокове. Ако даден файл е повреден, имате възможността все още да възстановите съдържанието му от здравите блокове – за целта разполагате с инструмента bzip2recover, с който можете да разархивирате неповредените данни от файла.
Ако оставим на страна някои малки различия, използването на bzip2 са почти същите, както при Gzip. И тук за най-обикновено компресиране е достатъчно да извикате командата bzip2 file. Компресирания файл получава окончанието .bz2 и както при Gzip компресираният файл получава същите свойства, както и изходния файл. За разлика от Gzip, инструмента Bzip2 приема и параметъра -k (от английски „keep“ = „запази“), с който създава резервно копие на файла след като същия бъде компресиран (архивиран).
Същото можете да постигнете с Gzip, но този път трябва да насочите изхода на командата да бъде записан в друг файл използвайки символа „>“, който посочва къде да бъде записан изхода от предната команда:
gzip -c файл > файл.gz
За съжаление по този начин компресирания файл не приема свойствата на изходния (напомням става дума за права върху файла, дата на създаване и промяна).
Както и при Gzip разполагате с параметрите -1 до -9 (стандартно) и в Bzip2, с които да окажете фактора на компресиране. Ако искате да промените стойността по подразбиране – става по същия начин, както и с Gzip – във файла ~/.bashrc добавяте реда export BZIP2="-6".
За разархивиране с Bzip2 добавяте параметъра -d или използвате специалната команда bunzip2, както и при Gzip има предпазване от презаписване на файлове, с тази разлика, че приложението не ви пита какво да направи:
$ bunzip2 zhbackground.bmp.bz2
bunzip2: Output file zhbackground.bmp already exists.
За да преодолеете защитата можете да използвате параметъра -f.
Още по-добре
Въпреки, че gzip и bzip2 са стандарти в Linux, съществуват и доста наследници като lzma, p7zip и xz, които от части са по-бързи или използват по-добри алгоритми за компресиране. Някои дистрибуции (като Slax) използват lzma за компресирането на софтуерни пакети, за да позволят добавянето на повече приложения в живия диск или да намалят времето за изтегляне от интернет.
И сега в архива
За да съберете повече файлове в даден архив използвате командата Tar. Името на програмата (от английски "tape archiver"), дава информация за произхода на приложението: tar се е използвал за контрола на лентови архиви. Tar дава малко повече от това просто да събира файлове в един архив. С добавянето на определени параметри можете да комбинирате работата му с приложенията gzip или bzip2 и по този начин получавате файлове с разширения tar.gz или tar.bz2.
За да съберте няколко файла в един архив като използвате командата:
tar -cvf архив.tar файл1 файл2
Трите параметъра -c, -v, -f, които използваме в горния пример се грижат за това - tar да създаде (-c = create), покаже какво се случва (-v = verbose) и да приеме като първи аргумент (-f = file) името на архива, който ще създаде.
Ако по-късно установите, че сте забравили някой файл, не е необходимо да създавате нов архив, а просто да добавите забравения файл:
tar -rf архив.tar файл3
Също толква лесно е и разопаковането с параметъра -x:
tar -xvf архив.tar
За да сме сигурни, че при разархивирането Tar няма да презапише вече съществуващи файлове със същото име, можем да разархивираме архива във временна поддиректория или да накараме tar да работи в сух режим (да симулира разархивирането), като за последното заменяме параметъра -x с -t.
За да архивирате директории с техните поддиректории и файлове е нужно да зададем само името на директорията вместо отделните файлове:
>$ tar -cvf архив.tar test/ test/ test/test2/ test/test2/zhbackground.jpg test/test2/testfile3.txt test/testfile.txt test/testfile2.txt
Ако искате да използвате Tar за създаването на backup, може да бъде доста полезно ако не желаете да добавяте определени директории. За целта помага параметъра --exclude. Освен това полезно би било при създаването на подобни копия да използваме и параметъра --rsh-command, като по този начин казваме на Tar че искате нашето копие да бъде копирано чрез SSH на друг компютър. Един доста пълен пример би изглеждал така:
tar -cvf user@host:/backup/tmp/backup_$(date '+%Y_%m_%d').tar --rsh-command=/usr/bin/ssh --exclude=/proc /
Разшифрована сравнително дългата команда означава следното: Създай чрез SSH на компютъра host в директорията /backup/tmp едно копие (backup) с името backup_, актуалната дата (date '+%Y_%m_%d') и разширение на файла .tar (за днешна дата файла би бил: backup_2010_04_20.tar). Като това копие трябва да съдържа всичко от / (root) директорията без директорията /proc, която от своя страна не съдържа истински файлове.
И сега всички!
Както вече споменахме, Tar разполага с няколко параметъра, които позволяват комбинирането му с Gzip и Bzip2. За създаването на компресиран архив с помощта на Gzip командата би изглеждала така:
tar -czvf архив.tar.gz файл(ове)
Ако искате вместо това да използвате Bzip2 трябва да промените параметъра -z с параметъра -j:
tar -cjvf архив.tar.bz2 файл(ове)
Съответно използвате същите параметри за обратната операция (разархивиране). Като използвайки tar по този начин си спестявате една цяла стъпка, в която вместо да използвате приложенията отделно:
bunzip2 архив.tar.bz2 tar -xvf архив.tar
използвате простия вариант: tar -xjvf архив.tar.bz2
Надявам се с тази статия да сте получили основните познания за архивирането под Linux и ако имате желание можете да прегледате останалите възможности, които крият споменатите инструменти.



