/ Статьи / Системное / Работа с архивами в Linux. Часть 1 /

Работа с архивами в Linux. Часть 1

Дата публикации: March 19, 2010, 9:10 p.m.
Теги: архивы,
Автор: Brainsburn

Работа с архивами в Linux Работа с архивами в Linux. Утилита TAR. Основные типы архивов. Создание, изменение, распаковка архивов. Работа с большим количеством файлов и архивов одновременно. Массовое переименование файлов.

В этой статье основное внимание я уделю консольным средствам Linux для работы с различными типами архивов, а в следующих статьях постараюсь описать графические программы для работы с архивами. Это сделано по нескольким причинам:
1) В графических программах не сложно разобраться самому
2) Эта статья написана в первую очередь для администраторов или тех, у кого нет возможности (или желания?) по каким-то причинам установить ПО с GUI.
3) Не знаю как вам, а мне приятно осознавать, что для выполнения самых трудных операций над файлами не обязательно прибегать к установке дополнительных тяжелых программных средств, достаточно лишь поближе познакомиться с теми маленькими, но очень мощными программками, которые присутствуют в наших дистрибутивах уже очень много лет :)

УТИЛИТА TAR

Tar - стандартное и самое популярное средство для архивирования/распаковки данных в Linux. Я опишу основные опции tar.

v Подробный вывод информации и работе.
f Эта опция позволяет записывать в файл. Т.е. ее нужно указывать всегда как при создании нового архива, так и при распаковке.
c Создание нового архива. Используется вместе с опцией f.
A Добавить файлы в архив. Внимание: сжатые архивы (bzip2 или gzip) нельзя изменить! Обновить/добавить файлы можно только в те архивы, которые созданы без сжатия, т.е. например так tar cf архив.tar имя-файла
r Добавить файлы в конец архива.
d Показать различия между архивами.
t Вывести список файлов в архиве.
u Добавить в архив только те файлы, что новее уже существующих в архиве.
x Извлечь файлы из архива. Вместе с этой опцией надо указывать тип архива.
j Указывает тип архива bzip2.
z Указывает тип архива gzip.
k Не перезаписывать существующие файлы.
--keep-newer-files Не перезаписывать существующие файлы, которые новее, чем файлы в архиве.
--remove-files Удалить файлы, после добавления их в архив.
w Интерактивный режим, в котором tar будет запрашивать подтверждения на каждое действие.
X имя-файла Не добавлять в архив файлы, список которых указан в файле "имя-файла".


Добавить файлы в существующий архив.
Добавление файлов в сжатый архив невозможно. Вы можете добавлять файлы только в несжатый архив. Поясню на примере:
$ ls
итого 8,8M
2,0M 1.djvu
1,3M 2.djvu
создаем несжатый архив
$ tar rf 1.tar 1.djvu 
$ ls
итого 11M
2,0M 1.djvu
2,1M 1.tar
1,3M 2.djvu
добавляем в него файлы
$ tar rf 1.tar 2.djvu 
$ ls
итого 13M
2,0M 1.djvu
3,3M 1.tar
1,3M 2.djvu
удаляем несжатый архив, создаем сжатый и пытаемся добавить в него файлы
$ rm 1.tar
$ tar czf 1.tar.gz 1.djvu 
$ ls
итого 11M
2,0M 1.djvu
2,0M 1.tar.gz
1,3M 2.djvu
$ tar rf 1.tar.gz 2.djvu 
tar: Невозможно обновить сжатые архивы
tar: Неисправимая ошибка: завершение работы

На самом деле вы, конечно, можете "обновить" сжатый архив, добавив в него файлы. Но программы, которые это делают, всего-лишь распаковывают существующий архив и создают новый с учетом файлов, которые надо добавить. Следует понимать, что между архивированием и сжатием файлов есть большая разница. К примеру, вы можете создать несжатый архив из многих файлов командой tar cf archive.tar documents/ , если надо быстро передать это кому-то как единый файл. Но на современных компьютерах можно не экономить и сжимать файл самым быстрым способом. Например, насколько мне известно, gzip сжимает/разжимает быстрее всего.




Как узнать тип архива?
Узнать тип архива в Linux поможет утилита file, которой в качестве аргумента надо передать имя файла. Утилита file определяет тип файла по содержимому а не по имени файла.
$ file 1.tar 
1.tar: POSIX tar archive (GNU)
# 1.tar - несжатый архив
$ file 1.tar.gz 
1.tar.gz: gzip compressed data, from Unix
# 1.tar.gz - архив gzip
$ file 1.tar.bz2 
1.tar.bz2: bzip2 compressed data
# 1.tar.bz2 - архив bzip2
$ file 1.zip 
1.zip: Zip archive data
# 1.zip - архив zip




Просмотреть список файлов в архиве.
Чтобы просмотреть список файлов в архиве, используйте опцию t.
$ tar tf архив.tar.gz 
1.djvu
scr.gif

Несколько простых примеров работы с архивами в GNU/Linux
Имеется несколько файлов, находящихся в одном каталоге, над которыми мы будем работать:
$ ls
итого 8,8M
2,0M 1.djvu
1,3M 2.djvu
1,1M 3.djvu
1,5M 4.djvu
3,0M 5.djvu


Создать архив из одного файла, сжатый GZIP
$ tar vczf 1.tar.gz 1.djvu
Создать архив из двух файлов, сжатый BZIP2
$ tar vcjf 1.tar.bz2 1.djvu 2.djvu
Архивировать каталог documents вместе со всем его содержимым как GZIP архив
$ tar vczf docs.tar.gz documents/
Распаковать в текущий каталог архив GZIP
$ tar vxzf 1.tar.gz
Распаковать в текущий каталог архив BZIP2
$ tar vxjf 1.tar.bz2
Распаковать архив GZIP в каталог documents/new/
$ mkdir documents && mkdir new
$ tar 
vxzf 1.tar.gz -C documents/new/



Создание бэкапа системы в Linux.
Я не хочу останавливаться на этом моменте, т.к. это тема отдельной статьи. Скажу лишь, что при архивировании всей системы ( / ) нужно учитывать точки монтирования файловых систем и такие виртуальные файловые системы как /proc и /dev . Также вам пригодится опция —ignore-failed-read , с ней tar не будет останавливаться в случае если встретит файл, который он не может прочитать. Опция --one-file-system тоже может быть полезна — она указывает Tar-у, чтобы он не выходил за пределы одной файловой системы. Это нужно, если вы архивируете корень, когда надо пропусить /proc и /dev . Создайте текстовый файл, в котором перечислите список того, что архивировать НЕ надо. Это могут быть каталоги tmp, файлы логов и даже сам файл с бэкапом. Имя файла допишите как аргумент к опции —exclude-from. Например, так —exclude-from=list.txt . По поводу выбора «сжимальщика» - gzip использовать вольготнее чем bzip2, т.к. Сжимает он намного быстрее (до 80%), проигрывая в размере архива примерно на 10-20%.


Создание множества архивов.
К примеру, есть такой список файлов
$ ls
итого 8,2M
1,4M 1.djvu
1,3M 2.djvu
1,1M 3.djvu
1,5M 4.djvu
3,0M 5.djvu
Нам надо сделать из этого 1.tar.gz 2.tar.gz 3.tar.gz и т.д.
Для этого можно воспользоваться конструкцией for i in список; do команда; done . Например, так:
$ for i in `ls`; do tar vczf $i.tar.gz $i; done
В этом случае имена получившихся будут иметь такой вид имя-файла.tar.gz, т.е. 1.djvu.tar.gz .Нет ничего страшного в том, что в имени архива есть «расширение» того файла, который в архиве лежит, т.к. В Linux изначально нет никаких «расширений» и, проще говоря, .tar.gz — всего-лишь часть имени файла. А тип файла частенько правильнее узнать утилитой file .

Но у этого способа есть и минусы. Например, у вас не получится обработать таким способом файлы, которые содержат пробелы в своем имени. На этот случай можно использовать другой, более практичный способ заархивировать много файлов:
$ find . -type f -exec tar vczf '{}.tar.gz' '{}' \;
Он будет работать даже если в именах файлов содержатся пробелы и спецсимволы.
$ ls -1
1 heh.djvu
2 huh.djvu
3 ой, хах,=упс.djvu
Ъ ужас.djvu
$ find . -type f -exec tar czf '{}.tar.gz' '{}' \;
$ ls -1
1 heh.djvu
1 heh.djvu.tar.gz
2 huh.djvu
2 huh.djvu.tar.gz
3 ой, хах,=упс.djvu
3 ой, хах,=упс.djvu.tar.gz
Ъ ужас.djvu
Ъ ужас.djvu.tar.gz
Не забудьте про опцию -type f утилиты find. Чтобы понять, зачем она нужна, выполните этот же скрипт без нее и затем выполните команду ls -a =)


Массовое переименование файлов в Linux
А вообще, старайтесь не использовать пробелы в именах файлов. Следующая конструкция переименовывает все файлы в текущем каталоге, заменяя пробелы на символы подчеркивания «_»:
$ find . -type f | while read i; do mv "$i"  "$(echo "$i" | tr ' ' _)"; done
Пример использования массового переименования файлов с заменой пробелов на символы подчеркивания:
$ ls -1
1 heh.djvu
2 huh.djvu
3 ой, хах,=упс.djvu
Ъ ужас.djvu
$ find . -type f | while read i; do mv "$i"  "$(echo "$i" | tr ' ' _)"; done
$ ls -1
1_heh.djvu
2_huh.djvu
3_ой,_хах,=упс.djvu
Ъ_ужас.djvu
Приведенная конструкция заменит пробелы на символы подчеркивания в именах файлов не только текущего но и всех вложенных каталогов. Если вам нужно переименовать файлы только в текущем каталоге, добавьте опцию -maxdepth 1 :
$ find . -maxdepth 1 -type f | while read i; do mv "$i"  "$(echo "$i" | tr ' ' _)"; done


Распаковка нескольких архивов.
Если вам надо разархивировать сразу много архивов, вы можете воспользоваться этим.
$ find . -maxdepth 1 -name "*.tar.gz" -type f  -exec tar vxzf {} \;
Эта команда найдет и распакует все архивы .tar.gz в текущем каталоге. Если нужно распаковать также и архивы в подкаталогах, надо убрать опцию -maxdepth 1






Возможно, эти материалы Вас заинтересуют:


Рекомендовать эту страницу:

Комментарии:(3)

# finval Feb. 22, 2013, 8:43 a.m.
Статья хорошая, всё доступно, спасибо!

# Tutanhamon Feb. 17, 2014, 7:17 p.m.
Вообще, архиваторов достаточно много, как, собственно, и алгоритмов сжатия. И каждый из них имеет свои плюсы и минусы. Конечно, самые известные это zip и rar, но они не всегда самые лучшие. С другой стороны, все зависит от задачи. Если вам нужен просто архив, который откроется где угодно, то лучше zip нету. Тем более он достаточно эффективный. Если нужно что-то похитрее, то тут уже надо выбирать.
Если вам интересно, то подробнее об аналогичных программах вы можете узнать в этом обзоре.

# Tutanhamon Sept. 25, 2014, 11:34 a.m.
Срок действия зеркала (домена) истек. Вот корректная ссылка на обзор архиваторов.

Комментировать:

Гость, Вы можете оставить свой комментарий.

Стиль кода:
Имя
Сайт * не обязательное поле
Поставьте галку, если вы - бот
Поставьте галку, если вы - человек

Друзья! Убедительная просьба воздержаться от нецензурной лексики!



Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.




Последние комментарии:

Eugene: Галка, внешний вид изменить совершенно не сложно.... >>>
Галка: А сильно сложно Убунту переделывать?... >>>
Brainsburn_: “Написание в 1-й” подразумевает “в первой”, а не в... >>>
ZZZ: “Написание в 1-й” подразумевает &ldquo... >>>
SBOdin: Спасибо за полезное руководство... >>>