Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

os

.pdf
Скачиваний:
15
Добавлен:
14.02.2015
Размер:
724.04 Кб
Скачать

форматов, такие как jpeg и png, уже в значительной мере сжаты, и применение gzip к таким файлам может не иметь эффекта. Обычно хорошо сжимаются текстовые файлы и такие двоичные файлы, как исполняемые модули и библиотеки.

Сведения о сжатом файле можно получить при помощи команды gzip -l, например: user-005@server:~$ gzip -l arch.txt.gz

compressed uncompr ratio uncompressed_name 103115 312996 67.0% arch.txt

Для того чтобы получить обратно оригинал сжатой версии, используется gunzip, например: gunzip arch.txt.gz

После выполнения этой команды получится: user-005@server:~$ gunzip arch.txt.gz user-005@server:~$ ls -l arch.txt

-rw-r-r-- 1 user-005 students 2355 25 Aug 17:54:00 arch.txt

Полученный файл идентичен оригиналу. Обратить внимание на то, что после декомпрессии файла сжатая версия удаляется. Вместо gunzip можно воспользоваться gzip -d (если например gunzip не установлена).

gzip записывает имя исходного файла в его сжатую версию. Поэтому если имя сжатого файла (вместе с расширением

.gz) оказывается слишком длинным для выбранного типа файловой системы (например, если сжатие производится в файловой системе MS-DOS с именами формата 8.3), имя исходного файла модет быть восстановлено gunzip, даже если при сжатии оно было усечено. Для декомпрессии файла с присвоением исходного имени используется параметр -N. Например:

user-005@server:~$ gzip arch.txt user-005@server:~$ mv arch.txt.gz garr.txt.gz

Если теперь декомпрессировать garr.txt.gz, то в результате полуится файл garr.txt, т.е. С тем же именем, что и сжатый файл. Однако задав параметр -N, получается:

user-005@server:~$ gunzip -N garr.txt.gz user-005@server:~$ ls -l arch.txt

-rw-r-r-- 1 user-005 students 2355 25 Aug 17:54:00 arch.txt

21

gzip и gunzip могут также осуществлять компрессию и декомпрессию данных со стандартного ввода и вывода. Если не сообщить gzip имен файлов, подлежащих компрессии, то программа пытается сжимать данные со стандартного ввода. Аналогично gunzip с параметром -с выводит декомпрессированные данные на стандартное устройство вывода. Можно, например, передать по каналу выходные данные некоторой команды на gzip, чтобы за один шаг сжать выходной поток и записать его в файл:

user-005@server:~$ ls -laR $HOME ‌gzip > filelist.gz

Эта команда произведет вывод содержимого исходного файла с подкаталогами и запишет результат в сжатый файл filelist.gz. Содержимое файла можно вывести командой:

user-005@server:~$ gunzip -с filelist.gz ‌more

Эта команда декомпрессирует filelist.gz и передаст результат по каналу команде more. Если используется команда с параметром gunzip -с, на диске остается сжатый файл.

Команда zcat аналогична gunzip -с. Можно рассматривать ее как версию cat для сжатых файлов.

При сжатии файлов можно использовать параметры -1, -2, …, -9, чтобы задать скорость и степень сжатия. При этом - 1 (или --fast) задает самый быстрый метод, слабее сжимающий файлы, а -9 (или --best) задает более медленный, но сильнее всего сжимающий файлы метод. По умолчанию значение метода сжатия равно -6. Эти параметры не влияют на использование команды gunzip, которая способна осуществить декомпрессию любого файла независимо от использованного метода сжатия.

Существует еще одна программа компрессии/декомпрессии, bzip2, перенявшая лидерство у gzip. bzip2 — новая программа, сжимающая в среднем на 10-20% сильнее, чем gzip, за счет большей продолжительности процесса сжатия. Нельзя использовать bunzip2 для декомпрессии файлов, сжатых gzip, и наоборот. Параметры командной строки для bzip2 и gzip отличаются друг от друга, но те, которые необходимо знать, можно получить о них сведения на страницах руководства. Для сжатия файлов следует использовать gzip/gunzip или bzip2/bunzip2. Если встречается файл с раширением

.z, то он, скорее всего, был создан с помощью compress (устаревшая программа), и gunzip может выполнить его декомпрессию.

Использование tar

tar является универсальной утилитой архивирования, способной упаковывать несколько файлов в один архивный, сохраняя при этом данные, необходимые для полного востановления, такие как права доступа и владения. Название tar происходит от tar archive, поскольку первоначально эта утилита предназначалась для архивирования файлов в виде

22

резервных копий на магнитных лентах. Формат команды tar следующий:

tar functionoptions files...

Здесь function является буквой, указывающей выполняемую операцию, options является списком однобуквенных параметров этой функции, а files — списком упаковываемых или распаковываемых файлов в архиве. (Обратить внимание, что function не отделяется проелом от параметров.)

Параметр function может принимать следующие значения: c – создать новый архив;

x – извлечь файлы из архива;

t – перечислить содержание архива; r – дописать файлы в конец архива;

u – заменить файлы в архиве более новыми;

d – сравнить архивированные файлы с файлами файловой системы. Чаще всего используются функции с, x и t.

Обычно используются следующие значения options:

k – сохранить при разархивации существующие файлы, т.е. Не заменять имеющиеся файлы извлекаемыми из архива; f filename – задать имя архивного файла, который нужно прочесть или записать;

z – указать, что записываемые в архив файлы или имеющиеся в нем сжимаются с помощью gzip; v – заставить tar показать имена файлов, помещаемых в архив или извлекаемых из него.

Синтаксис tar может сначала показаться сложным, но на практике он очень прост. Например, имеется каталог mt, содержащий следующие файлы:

user-005@server:~$ ls -l mt

23

total 37

 

 

 

 

 

 

-rw-r--r--

1 user-005 students

24

25 Aug

17:54:00

arch.txt.gz

-rw-r--r--

1 user-005 students

847

30 Aug

10:04:00

READMI

-rwxr-xr-x 1 user-005 students

9220

5 Sep

7:50:00

mt

-rw-r--r--

1 user-005

students

2775

13 Sep

18:34:00 mt.1

-rw-r--r--

1 user-005

students

6421

28 Sep

10:26:00 mt.c

-rw-r--r--

1 user-005

students

3948

2 Nov

22:04:00 mt.0

-rw-r--r--

1 user-005

students

11204 12 Nov

19:47:00 st_my.txt

Далее нужно упаковать содержимое этого каталога в один архивный tar-файл, для этого используется команда: tar cf mt.tar mt

В данном случае первым аргументом tar является функция c (от create), за которой следуют параметры. Здесь используется один параметр f mt.tar, указывающий, что результирующий архифный файл должен иметь имя mt.tar. Последним аргументом является имя (или имена) архивируемого файла. В данном случае задается имя каталога, чтобы tar упаковал в архив все файлы этого каталога.

Обратить внимание нужно на то, что первым аргументом должна быть буква функции, за которой следует список ее параметров. Поэтому нет смысла ставить дефис (-) перед параметрами, как того требуют многие команды в Linux. tar разрешает использовать дефис следующим образом:

tar -cf mt.tar mt

но в этом нет необходимости. В некоторых версиях tar первой буквой должна быть функция, то есть с, t или x. В других версиях порядок букв не является существенным. Описанные здесь буквы функции следуют так называемому «старому стилю» параметров. Есть также более новый «стиль коротких параметров», в котором параметрам функции предшествует дефис, и «стиль длинных параметров», где используются длинные имена параметров с двумя дефисами.

Не следует забывать указать имя файла, если используются буквы cf, иначе будет переписан первый файл в списке упаковываемых файлов, поскольку он будет принят за имя архива!

Часто бывает полезно использовать tar с параметром v, что позволяет вывести перечень архивируемых файлов. Например:

24

user-005@server:~$ tar cvf mt.tar mt mt/

mt/st_my.txt mt/READMI mt/mt.1 mt/arch.txt.gz mt/mt.c mt/mt.0 mt/mt

Если задать v несколько раз, выводятся дополнительные сведения, например:

user-005@server:~$ tar cvvf mt.tar mt

 

drwxr-xr-x students/ students

0

15 Nov

17:35:00 mt/

-rw-r--r--

students/ students

11204 12 Nov

19:47:00 mt/st_my.txt

-rw-r--r--

students/ students

847

30 Aug

10:04:00 mt/READMI

-rw-r--r--

students/ students

2775

13 Sep

18:34:00 mt/mt.1

-rw-r--r--

students/ students

24

25 Aug

17:54:00 mt/arch.txt.gz

-rw-r--r--

students/ students

6421

28 Sep

10:26:00 mt/mt.c

-rw-r--r--

students/ students

3948

2 Nov

22:04:00 mt/mt.0

-rwxr-xr-x 1 user-005 students

9220

5 Sep

7:50:00 mt/mt

Это очень полезно, т.к. позволяет убедиться в том, то tar делает то, что требуется.

Теперь можно передать файл mt.tar другим пользователям для распаковки на своих машинах. Распаковать можно командой:

tar xvf mt.tar

25

В результате выполнения этой команды создается подкаталог mt, в который помещаются все исходные файлы с теми же правами доступа, которые были в исходной системе. Владельцем новых файлов будет пользователь, выполнивший команду tar xvf, если только разархивацию не произвел root. В последнем случае сохраняется первоначальный владелец файла. Параметр x означает извлечение файлов, параметр v используется для перечесления всех извлекаемых файлов. Вывод будет таким:

user-007@server:~$ tar xvf mt.tar mt/

mt/st_my.txt mt/README mt/mt.1 mt/arch.txt.gz mt/mt.c mt/mt.0 mt/mt

Как видно tar сохраняет имя пути каждого файла относительно того расположения, где первоначально был создан архивный файл. Когда создавался архив tar cf mt.tar mt, единственным заданным именем входного файла было mt – имя содержащего файлы каталога. Поэтому tar записывает в архивный файл сам каталог и все находящиеся в нем файлы. Когда извлекаюся файлы из архива, создается каталог mt, в который помещаются все файлы, что является процедурой, прямо противоположной созданию архива.

По умолчаию tar извлекает из архива все файлы относительно текущего каталога, в котором запускается tar. Например, если нужно было бы упаковать содержимое каталога /bin командой

tar cvf bin.tar /bin

то получили бы от системы предупреждение:

tar: Removing leading / from absolute path in the archive.

(удаление ведущих / из абсолютных путей в архиве)

Это означает, что файлы будут сохранены в архиве в подкаталоге bin. При распаковке каталог bin создается в рабочем каталоге tar, а не как /bin в системе, в которой производится распаковка. Это очень важно и имеет целью предотвращение

26

катастрофических ошибок при распаковке. В противном случае распаковка файла, содержащего упакованный /bin, привела бы к уничтожению текущего каталога /bin. Если же действительно нужно распаковать такой архив в /bin, то это нужно делать, находясь в корневом каталоге /.

Другим способом создания архива mt.tar был бы переход командой cd непосредственно в каталог mt и использования такой команды, как

tar cvf mt.tar *

При таком способе подкаталог mt не записывается в архивный файл, и при распаковке файлы помещаются в текущий рабочий каталог.

Прежде чем распаковывать содержимое архива, неплохо посмотреть на таблицу его содержимого и определить как он был упакован. В результате просмотра можно решить, нужно ли создавать подкаталог для распаковки архива. Команда

tar tvf tarfile

выводит таблицу содержимого архива с именем tarfile. Обратить внимание, что при использовании функции t требуется только один параметр v, чтобы получить «длинную» распечатку перечня файлов.

user-007@server:~$ tar tvf mt.tar

 

 

drwxr-xr-x students/ students

0

15 Nov

17:35:00 mt/

-rw-r--r--

students/ students

11204 12 Nov

19:47:00 mt/st_my.txt

-rw-r--r--

students/ students

847

30 Aug

10:04:00 mt/README

-rw-r--r--

students/ students

2775

13 Sep

18:34:00 mt/mt.1

-rw-r--r--

students/ students

24

25 Aug

17:54:00 mt/arch.txt.gz

-rw-r--r--

students/ students

6421

28 Sep

10:26:00 mt/mt.c

-rw-r--r--

students/ students

3948

2 Nov

22:04:00 mt/mt.0

-rwxr-xr-x 1 user-005 students

9220

5 Sep

7:50:00 mt/mt

Распаковка при этом не производится, видно только таблицу содержимого архива. Имена файлов говорят о том, что файл архива был создан из всех файлов подкаталога mt, и при распаковке архива будет создан подкаталог mt, в который будут

27

помещены все файлы.

Теперь можно извлекать из архива и отдельные файлы. Для этого служит команда tar xvf tarfile files

Здесь files является списком извлекаемых из архива файлов. Если не указать имен, tar распаковывает весь архив.

При указании отдельных файлов, которые нужно извлечь, следует задавать полный путь, как он указан в архиве. Например, если потребовалось извлечь из предыдущего архива только файл mt.c, это можно сделать командой

tar xvf mt.tar mt/mt.c

В результате создается подкаталог mt, в который помещается mt.c.

Использование tar совместно с gzip и bzip2

tar не осуществляет компрессии данных, сохраняемых в его архивах. Если создать tar-архив из трех файлов по 300 Кбайт, то получится архив размером 900 Кбайт. Часто tar-архивы сжимаются с помощью gzip. Сжатый tar-архив можно создать, выполнив команды:

tar cvf tarfile files...

gzip -9 tarfile

Но это весьма утомительно и требует наличия достаточного объема памяти для хранения несжатого архивного файла, прежде чем подвергнуть его обработке gzip.

Другой способ выполнить ту же задачу — использовать функцию tar, позволяющую вывести архив на стандартное устройство вывода. Если задать архивный файл для чтения или записи как «-», то данные будут считываться со стандартного устройства ввода и выводиться на стандартное устройство вывода. Например:

tar cvf – files | gzip -9 > tarfile.tar.gz

Здесь tar создает архив из файлов с перечисленными именами и выводит его на стандартное устройство вывода; затем gzip читает данные из стандартного устройства ввода, сжимает их и выводит на свое стандартное устройство вывода; и затем сжатый архивный файл перенаправляется в tarfile.tar.gz.

Распаковать такой архивный файл можно с помощью команды gunzip -9c tarfile.tar.gz | tar xvf -

28

gunzip декомпрессирует указанный архивный файл, выодит результат на стандартное устройство вывода, откуда он считывается утилитой tar, как со стандартного ввода, и распаковывается.

Но, обе эти команды печатать долго. Поэтому tar имеет параметр z, задание которого автоматически создает или распаковывает сжатые архивы. Можно использовать следующие команды

tar cvzf tarfile.tar.gz files...

и

tar xvzf tarfile.tar.gz

Обратить внимание нужно на то, что создаваемым таким образом файлам нужно присваивать расширение .tar.gz (или столь же часто используемое .tgz, которое удобно использовать в системах с ограничениями на имена файлов), чтобы был ясен их формат. Параметр z нормально работает и с другими функциями tar, такими как t.

Можно также использовать tar вместе с bzip2, о выборе программы сжатия сообщить нужно следующим образом: tar cvf tarfile.tar.bz2 --use-compress-program=bzip2 files...

или короче:

tar cvf tarfile.tar.bz2 --use=bzip2 files...

или еще короче:

tar cvjf tarfile.tar.bz2 files

Последняя версия работает только с последними версиями GNU tar, поддерживающими параметр j.

Имея это ввиду, можно писать короткие сценарии оболочки или псевдонимы для создания архивных файлов и их распаковки. Используя оболочку bash, можно включить в файл .bashrc следующие функции:

tarc () { tar czvf $1.tar.gz $1 } tarx () { tar xzvf $1 }

tart () { tar tzvf $1 }

Если определены такие функции, то создать сжатый архивный файл из отдельного каталога можно с помощью команды tarc directory

Полученный архивный файл будет назван directory.tar.gz. Чтобы вывести список файлов сжатого tar-архива, нужно

29

выполнить такую команду tart file.tar.gz

Для распаковки такого архива выполнить команду tarx file.tar.gz

Следует отметить, что файлы, созданные с помощью gzip и/или tar, могут распаковываться хорошо известной утилитой WinZip в Windows. WinZip пока не поддерживает bzip2. И наооборот, файл в формате .zip можно распаковать на машине под Linux с помощью команды unzip.

Приемы работы с tar

Поскольку tar записывает в архив права владения и доступа к файлам, а также сохраняет полную структуру каталогов, символические и жесткие ссылки, с его помощью очень удобно копировать или перемещать целое дерево каталогов из одного места в другое в пределах данной системы и даже, с одной машины на другую. Используя описанный ранее синтаксис с минусом, можно вывести tar-архив на стандартное устройство вывода, откуда он читается и распаковывается в любое место через стандартное устройство ввода.

Имеется каталог с двумя подкаталогами — ms1 и ms2. Каталог ms1 содержит целое дерево файлов, символических ссылок и т.д., которые трудно точно отобразить, используя команду cp с рекурсией. Для того чтобы скопировать все дерево из каталога ms1 в каталог ms2, можно выполнить следующие команды:

cd ms1

tar cf - . | (cd ../ms2; tar xvf -)

Начинается работа в каталоге ms1 и создается архив текущего каталога, который выводится на стандартное устройство вывода. Этот архив читается подоболочкой (содержащейся в скобках команды); подоболочка совершает переход в целевой каталог ../ms2 (относительно ms1) и выполняет tar xvf, осуществляя чтение со стандартного устройства ввода. Никаких архивных файлов на диск не пишется; данные посылаются через канал от одного процесса tar другому. Второй процесс tar запускается с параметром v, благодаря чему выводятся имена всех распаковываемых файлов, что позволяет контролировать правильность работы команды.

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]