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