tar е един от популярните формати за архивиране на файлове, налични в Unix и Linux базирани системи.
Самото име произлиза от Tape ARchive, тъй като е разработено за запис на последователни данни на лентови устройства. Понякога се нарича и tarball.
По подразбиране tar архивира само файловете без компресия, но използвайки някои части. Можем да използваме различни техники за компресиране, за да получим компресиран изход. Помощната програма tar обикновено е включена в повечето Linux дистрибуции по подразбиране, а самият формат се поддържа в други операционни системи, включително Windows и macOS, чрез различни инструменти и помощни програми.
В тази статия ще разгледаме някои от често срещаните примери и използване на командата tar и нейните поддържани флагове.
И така, нека да започнем…
Съдържание
Създайте tar архив
За да създадете прост некомпресиран архив, синтаксисът за командата tar е:
$ tar cvf <tar-file-name> <files-to-archive>
Тук флаговете c означават създаване, v за подробен изход и f за указване на името на архивния файл в tar. По конвенция, посочете името на файла tar с разширение .tar. Файловете за архивиране могат да бъдат посочени със заместващи символи или като единични или множество имена/пътища на файлове.
Като пример, имам три файла в моята директория:
$ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
И искам да създам tar архив, съдържащ и трите файла, може да се направи като:
$ tar cvf archive.tar * file1.txt file2.txt file3.txt $ ls -l archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar $
Мога да посоча само конкретни файлове за архивиране, като:
$ tar cvf archive1.tar file1.txt file2.txt file1.txt file2.txt $ ls -l archive1.tar -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive1.tar $
Създаване на компресиран архив (GZ)
tar не само позволява архивиране на файлове, но също така ги компресира, за да спести място. Един от популярните формати за компресиране е gunzip, обикновено представен от разширение .gz след .tar или като tgz. Можем да използваме z флаг, за да посочим, че трябва файловете да бъдат компресирани с gunzip. Ето един пример:
$ tar cvzf archive.tar.gz file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $
Можете да забележите, че размерът на двата архивни файла е значително различен, въпреки че и двата съдържат едни и същи три файла. Това се дължи на използването на компресия чрез z флаг.
Създаване на компресиран архив (BZ2)
tar поддържа няколко други формата за компресиране. Един от тях е bz2 или bzip2, който е представен от разширение tar.bz2 или понякога като tbz2. Може да ви даде по-малък размер на архива, но от своя страна консумира повече CPU, така че процесът на компресиране/декомпресиране може да бъде по-бавен от gz архива.
Пример:
$ tar cvjf archive.tar.bz2 file* file1.txt file2.txt file3.txt $ ls -l archive.tar archive.tar.gz archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 12 20:15 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 12 20:25 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 12 20:21 archive.tar.gz $ file archive.tar* archive.tar: POSIX tar archive (GNU) archive.tar.bz2: bzip2 compressed data, block size = 900k archive.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 10240 $
Разархивирайте всички файлове
Архив tar (независимо дали е компресиран или некомпресиран) може да бъде извлечен просто с помощта на опцията x. Примерите по-долу ще изяснят употребата му:
$ tar xvf archive.tar file1.txt file2.txt file3.txt $ ls -l total 24 -rw-r--r-- 1 abhisheknair abhisheknair 10240 Sep 19 18:25 archive.tar -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Това работи за gz компресиран архив като:
$ tar xvf archive.tar.gz file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 188 Sep 19 18:27 archive.tar.gz -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Или дори за bz2 компресиран архив като:
$ tar xvf archive.tar.bz2 file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Списък на съдържанието на tar
За да изброите съдържанието на tar архив, можете да използвате флага t, както е показано по-долу:
$ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $
Разархивирайте конкретни файлове
Само един файл може да бъде извлечен от архив tar или tar.gz или tar.bz2, като посочите име на файл като:
$ tar xvf archive.tar.bz2 file1.txt file1.txt $ ls -l total 8 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt $
По същия начин можете да посочите няколко имена на файлове, разделени с интервал, за да ги извлечете заедно наведнъж.
$ tar xvf archive.tar.bz2 file1.txt file3.txt file1.txt file3.txt $ ls -l total 12 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Разархивирайте с помощта на заместващ знак
За да извлечете един или повече файлове с помощта на шаблон за заместване, използвайте флага за заместващи знаци:
$ tar xvf archive.tar.bz2 --wildcards "file*" file1.txt file2.txt file3.txt $ ls -l total 16 -rw-r--r-- 1 abhisheknair abhisheknair 212 Sep 19 18:31 archive.tar.bz2 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 19 Sep 12 20:08 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt $
Добави файлове в архива
Нови файлове могат да се добавят/добавят към съществуващи некомпресирани tarballs чрез използване на r или –append флаг с нови имена на файлове или шаблон за заместващи знаци (не забравяйте, че това работи само с некомпресирани .tar файлове, а не с компресирани формати tar.gz или tar.bz2):
$ tar rvf archive.tar file-new* file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $
Можете да забележите, че изброяването на съдържанието на archive.tar отново показва двата новодобавени файла.
Изтриване на файлове от архива
Премахването на конкретни файлове от tar архив е възможно с помощта на флага –delete, както е показано по-долу (сравнете списъка на tar преди и след изтриване на файлове):
$ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new.txt -rw-r--r-- abhisheknair/abhisheknair 9 2021-09-19 19:10 file-new2.txt $ tar --delete -f archive.tar file-new.txt file-new2.txt $ tar tvf archive.tar -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt -rw-r--r-- abhisheknair/abhisheknair 15 2021-09-19 18:59 file2.txt -rw-r--r-- abhisheknair/abhisheknair 10 2021-09-19 18:58 file4.txt $
Отново това работи само за некомпресирани tarballs и няма да успее за компресирани архивни формати.
Създайте с Verify
Докато създавате некомпресирани tar файлове, можете да проверите съдържанието на архива с помощта на W флаг като:
$ tar cvfW archive.tar file*.txt file1.txt file2.txt file3.txt Verify file1.txt Verify file2.txt Verify file3.txt $
Това не може да се използва с флагове за компресия, въпреки че можете да компресирате създадения tar файл по-късно с помощта на gzip или други инструменти.
Извличане на tar в папка
Ако искате да извлечете съдържанието на tarball в конкретна папка вместо в текущата директория, използвайте флага -C с пътя на директорията, както е показано по-долу:
$ tar xvf archive.tar -C new-directory/ file1.txt file2.txt file3.txt file2.txt file4.txt $ ls -l new-directory/ total 16 -rw-r--r-- 1 abhisheknair abhisheknair 13 Sep 12 20:08 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 15 Sep 19 18:59 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 24 Sep 12 20:08 file3.txt -rw-r--r-- 1 abhisheknair abhisheknair 10 Sep 19 18:58 file4.txt $
Използвайте разл. флаг
Можете да използвате –diff или d флаг, за да намерите промени между файловете в tar архива и тези във файловата система. Ето един пример, който изпълнява разликата веднъж, когато файлът вътре и извън tar е един и същ. След актуализирането на файла той беше стартиран отново, за да покаже разликата в изхода.
$ tar dvf archive.tar file4.txt file4.txt $ $ echo newline > file4.txt $ $ tar dvf archive.tar file4.txt file4.txt file4.txt: Mod time differs file4.txt: Size differs $
Изключване на файлове
Изключването на определени файлове може да бъде изискване при създаване на tar архиви. Това може да се постигне с флаг за изключване.
$ tar --exclude="dir/file2.txt" --exclude="dir/file-new*.txt" -cvzf archive.tar.gz dir/ dir/ dir/file1.txt dir/file3.txt $ ls -l dir total 24 -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new.txt -rw-r--r-- 1 abhisheknair abhisheknair 9 Sep 19 19:10 file-new2.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:20 file-new3.txt -rw-r--r-- 1 abhisheknair abhisheknair 5 Sep 19 19:27 file1.txt -rw-r--r-- 1 abhisheknair abhisheknair 6 Sep 19 19:27 file2.txt -rw-r--r-- 1 abhisheknair abhisheknair 8 Sep 19 19:27 file3.txt $ tar tvf archive.tar.gz drwxr-xr-x abhisheknair/abhisheknair 0 2021-09-19 19:30 dir/ -rw-r--r-- abhisheknair/abhisheknair 5 2021-09-19 19:27 dir/file1.txt -rw-r--r-- abhisheknair/abhisheknair 8 2021-09-19 19:27 dir/file3.txt $
Както можете да забележите от горния изход, можем да посочим флага –exclude няколко пъти, за да посочим множество имена на файлове или шаблони в условие И. Обърнете внимание, че от шестте файла в директорията в горния пример само два файла отговарят на условието да бъдат включени в archive.at.gz.
Преглед на размера на съдържанието на tar
Можем да получим размера на съдържанието на компресиран tar архив, като използваме командата по-долу:
$ tar tvf archive.tar.gz -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xzf archive.tar.gz --to-stdout|wc -c 56 $
По същия начин за bz2 архив:
$ tar tvf archive.tar.bz2 -rw-r--r-- abhisheknair/abhisheknair 13 2021-09-12 20:08 file1.txt -rw-r--r-- abhisheknair/abhisheknair 19 2021-09-12 20:08 file2.txt -rw-r--r-- abhisheknair/abhisheknair 24 2021-09-12 20:08 file3.txt $ tar -xjf archive.tar.bz2 --to-stdout|wc -c 56 $
Запазване на разрешенията
По подразбиране командата tar запазва разрешенията за файловете и директориите, които архивира, въпреки че можете изрично да посочите същото, като използвате флага -p или –preserve-permissions, както е показано по-долу:
$ tar cvpzf archive.tar.gz *.txt file1.txt file2.txt file3.txt $
Резюме 👨💻
tar е полезна помощна програма за Unix/Linux системи от дълго време и се използва предимно при задачи за архивиране и архивиране. Помощната програма се разви с много опции с течение на времето. Може да се използва за прости до сложни задачи, ако знаете функциите, които предлага. Тази статия обхваща някои от основните операции, които можете да извършвате с командата tar, и показва как тя може да ви помогне в ежедневните ви задачи за системно администриране.
Обърнете се към страницата му man tar или използвайте командата tar –help или tar –usage, за да получите повече подробности.