ZIP-файлы
9.4 ZIP-файлы
Утилита архивирования де-факто в Microsoft — это ZIP-файл. ZIP не так распространен в Linux, но хорошо поддерживается командами zip
и unzip
. Хотя с tar
и gzip
/ gunzip
одни и те же команды и параметры могут использоваться взаимозаменяемо для создания и извлечения, но это не относится к zip
. Одна и та же опция имеет разные значения для двух разных команд.
Режим по умолчанию zip
— добавлять файлы в архив и сжимать его.
zip [OPTIONS] [zipfile [file…]]
Первый аргумент zipfile
— это имя создаваемого архива, после него — список добавляемых файлов. В следующем примере показано alpha_files.zip
создание сжатого архива:
sysadmin@localhost:~/Documents$ zip alpha_files.zip alpha*
adding: alpha-first.txt (deflated 32%)
adding: alpha-second.txt (deflated 36%)
adding: alpha-third.txt (deflated 48%)
adding: alpha.txt (deflated 53%)
adding: alpha_files.tar.gz (stored 0%)
Вывод показывает файлы и степень сжатия.
Следует отметить, что tar
требуется –f
параметр, указывающий, что имя файла передается, в то время как zip
и unzip
требуется имя файла, и поэтому вам не нужно сообщать команде, что имя файла передается.
Команда zip
не будет рекурсивно обращаться к подкаталогам по умолчанию, что отличается от поведения tar
команды. То есть простое добавление School
добавит только пустой каталог, а не файлы в нем. Если вы хотите tar
подобное поведение, вы должны использовать –r
параметр, чтобы указать, что рекурсия должна использоваться:
sysadmin@localhost:~/Documents$ zip -r School.zip School
updating: School/ (stored 0%)
updating: School/Engineering/ (stored 0%)
updating: School/Engineering/hello.sh (deflated 88%)
updating: School/Art/ (stored 0%)
updating: School/Art/linux.txt (deflated 49%)
updating: School/Math/ (stored 0%)
updating: School/Math/numbers.txt (stored 0%)
adding: School/Art/red.txt (deflated 33%)
adding: School/Art/hidden.txt (deflated 1%)
adding: School/Art/animals.txt (deflated 2%)
В приведенном выше примере все файлы в School
каталоге добавляются, потому что он использует –r
опцию. Первые строки вывода указывают, что каталоги были добавлены в архив, но в остальном вывод аналогичен предыдущему примеру.
Опция –l
list команды выводит unzip
список файлов в .zip
архивах:
sysadmin@localhost:~/Documents$ unzip -l School.zip
Archive: School.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-12-20 16:46 School/
0 2018-10-31 17:47 School/Engineering/
647 2018-10-31 17:47 School/Engineering/hello.sh
0 2018-10-31 19:31 School/Art/
83 2018-10-31 17:45 School/Art/linux.txt
0 2018-10-31 17:46 School/Math/
10 2018-10-31 17:46 School/Math/numbers.txt
51 2018-10-31 19:31 School/Art/red.txt
67 2018-10-31 19:30 School/Art/hidden.txt
42 2018-10-31 19:31 School/Art/animals.txt
--------- -------
900 10 files
0 2018-10-31 17:46 School/Math/
10 2018-10-31 17:46 School/Math/numbers.txt
--------- -------
740 7 files
Извлечение файлов аналогично созданию архива, так как команда по умолчанию unzip
выполняет извлечение. Это дает несколько вариантов, если распаковка файлов перезапишет существующие:
sysadmin@localhost:~/Documents$ unzip School.zip
Archive: School.zip
replace School/Engineering/hello.sh? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/linux.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Math/numbers.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/red.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/hidden.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/animals.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
Этого можно избежать, скопировав zip-файл в новый каталог:
sysadmin@localhost:~/Documents$ mkdir tmp
sysadmin@localhost:~/Documents$ cp School.zip tmp/School.zip
sysadmin@localhost:~/Documents$ cd tmp
sysadmin@localhost:~/Documents/tmp$ unzip School.zip
Archive: School.zip
creating: School/
creating: School/Engineering/
inflating: School/Engineering/hello.sh
creating: School/Art/
inflating: School/Art/linux.txt
creating: School/Math/
extracting: School/Math/numbers.txt
inflating: School/Art/red.txt
inflating: School/Art/hidden.txt
inflating: School/Art/animals.txt
Здесь мы извлекаем все файлы из архива в текущий каталог. Точно так же tar
вы можете передавать имена файлов в командной строке. В приведенных ниже примерах показаны три разные попытки извлечения файла.
Во-первых, передается только имя файла без компонента каталога. Мол tar
, файл не совпадает.
sysadmin@localhost:~/Documents/tmp$ unzip School.zip linux.txt
Archive: School.zip
caution: filename not matched: linux.txt
Вторая попытка передает компонент каталога вместе с именем файла, который извлекает только этот файл.
sysadmin@localhost:~/Documents/tmp$ unzip School.zip School/Math/numbers.txt
Archive: School.zip
extracting: School/Math/numbers.txt
В третьей версии используется подстановочный знак, который извлекает четыре файла, соответствующих шаблону, точно так же, как tar
.
sysadmin@localhost:~/Documents/tmp$ unzip School.zip School/Art/*t
Archive: School.zip
inflating: School/Art/linux.txt
inflating: School/Art/red.txt
inflating: School/Art/hidden.txt
inflating: School/Art/animals.txt
Страницы руководства zip
и unzip
описывают другие действия, которые вы можете выполнять с помощью этих инструментов, такие как замена файлов в архиве, использование различных уровней сжатия и даже использование шифрования.
Last updated