Linuxのzip/unzipコマンドで覚えておきたい使い方11個

Linuxでzipファイルを扱う際、欠かせないのがzip/unzipコマンド。
今回は、このコマンドについて覚えておきたい使い方について紹介しておく。

1.基本的な使い方

基本的には、zipファイルとして圧縮もしくは解凍する際は以下のようにコマンドを実行する。

zip 作成するZIPファイルPATH 圧縮対象PATH ... # 圧縮時
unzip 解凍するZIPファイルPATH # 解凍時

[root@test-centos7 ~]# zip /tmp/test1.zip /work3/TEST1.sh /work3/TEST2.sh
  adding: work3/TEST1.sh (deflated 16%)
  adding: work3/TEST2.sh (deflated 27%)
[root@test-centos7 ~]#
[root@test-centos7 ~]# unzip /tmp/test1.zip
Archive:  /tmp/test1.zip
  inflating: work3/TEST1.sh
  inflating: work3/TEST2.sh

なお、作成するファイルPATHに既存のzipファイルを指定すると、ファイルのUPDATE及び追加をデフォルトで行ってくれる。
(削除はしない)

[root@test-centos7 ~]# zip /tmp/test1.zip /work3/TEST1.sh /work3/TEST2.sh
  adding: work3/TEST1.sh (deflated 16%)
  adding: work3/TEST2.sh (deflated 27%)
[root@test-centos7 ~]# ls -la /tmp/test1.zip
-rw-r--r--. 1 root root 493 11月 17 06:24 /tmp/test1.zip
[root@test-centos7 ~]# zip /tmp/test1.zip /work3/TEST1.sh /work3/TEST2.sh /work3/TEST3.sh
updating: work3/TEST1.sh (deflated 16%)
updating: work3/TEST2.sh (deflated 27%)
  adding: work3/TEST3.sh (deflated 25%)
[root@test-centos7 ~]# ls -la /tmp/test1.zip
-rw-r--r--. 1 root root 762 11月 17 06:24 /tmp/test1.zip

2.ディレクトリを指定して再帰的に圧縮する

オプション無しの場合、zipコマンドではディレクトリのみを指定すると中のファイルは圧縮してくれない。
ディレクトリ配下を再帰的に圧縮する場合は、「-r」オプションを付与する。

zip -r 作成するzipファイルPATH 再帰的に圧縮するフォルダ

[root@test-centos7 ~]# zip -r /tmp/test1.zip /work3/
updating: work3/TEST1.sh (deflated 16%)
updating: work3/TEST2.sh (deflated 27%)
  adding: work3/ (stored 0%)
  adding: work3/work/ (stored 0%)
  adding: work3/work/ln_test.txt (deflated 46%)
  adding: work3/work/ln_test.txt2 (deflated 46%)
  adding: work3/work/aaaaa.txt (stored 0%)
  adding: work3/work/bbbbb.txt (stored 0%)
  adding: work3/work/ccccc.txt (stored 0%)
  adding: work3/work/ddddd.txt (stored 0%)
  adding: work3/work/test.txt (deflated 46%)
  adding: work3/work/test2.txt (deflated 69%)
  adding: work3/aaaaa.txt (stored 0%)
  adding: work3/bbbbb.txt (stored 0%)
  adding: work3/ccccc.txt (stored 0%)
  adding: work3/ln_aaaaa.txt (stored 0%)
  ...

3.圧縮対象となるファイル名を指定して圧縮する

特定の拡張子のファイルのみを圧縮する場合は、「-i」オプションをコマンドの末尾に付与する。
なお、指定できるファイル名はpathである点に注意。ファイル名だけで圧縮が出来ないので、基本的にはワイルドカードと組み合わせて使用する。

zip 作成するZIPファイルPATH 圧縮対象PATH ... -i 圧縮対象ファイル名

[root@test-centos7 ~]# zip -r /tmp/test1.zip /work3/ -i *test*.py
  adding: work3/test.py (deflated 65%)
  adding: work3/test1.py (deflated 51%)
  adding: work3/test10.py (deflated 73%)
  adding: work3/test11.py (deflated 59%)
  adding: work3/test12.py (deflated 71%)
  adding: work3/test13.py (deflated 60%)
  adding: work3/test14.py (deflated 45%)
  adding: work3/test15.py (deflated 35%)
  ...

4.zipファイルの解凍先を指定する

unzipで解凍先のPATHを指定する場合は、「-d」オプションで解凍先PATHを指定することで行える。

unzip 解凍するZIPファイルPATH -d 解凍先PATH

[root@test-centos7 ~]# mkdir /tmp/test1233
[root@test-centos7 ~]# unzip /tmp/test1.zip -d /tmp/test1233
Archive:  /tmp/test1.zip
  inflating: /tmp/test1233/work3/test.py
  inflating: /tmp/test1233/work3/test1.py
  inflating: /tmp/test1233/work3/test10.py
  inflating: /tmp/test1233/work3/test11.py
  inflating: /tmp/test1233/work3/test12.py
  inflating: /tmp/test1233/work3/test13.py
  inflating: /tmp/test1233/work3/test14.py
  inflating: /tmp/test1233/work3/test15.py
  ...

5.パスワードを指定して圧縮する

zipコマンドでは、「-e」オプションを付与することで圧縮ファイルにパスワードを付与することも出来る。

zip -e 作成するZIPファイルPATH 圧縮対象PATH ...

[root@test-centos7 ~]# zip -er /tmp/test1.zip /work3/ -i *test1*.py
Enter password:
Verify password:
  adding: work3/test1.py (deflated 51%)
  adding: work3/test10.py (deflated 73%)
  adding: work3/test11.py (deflated 59%)
  adding: work3/test12.py (deflated 71%)
  adding: work3/test13.py (deflated 60%)
  adding: work3/test14.py (deflated 45%)
  adding: work3/test15.py (deflated 35%)
  adding: work3/test16.py (deflated 29%)
  adding: work3/test17.py (deflated 66%)
  adding: work3/test18.py (deflated 43%)
  adding: work3/test19.py (deflated 57%)
[root@test-centos7 ~]#
[root@test-centos7 ~]# unzip /tmp/test1.zip
Archive:  /tmp/test1.zip
[/tmp/test1.zip] work3/test1.py password:
  inflating: work3/test1.py
  inflating: work3/test10.py
  inflating: work3/test11.py
  inflating: work3/test12.py
  inflating: work3/test13.py
  inflating: work3/test14.py
  inflating: work3/test15.py
  inflating: work3/test16.py
  inflating: work3/test17.py
  inflating: work3/test18.py
  inflating: work3/test19.py

6.zipファイルの中身を確認する

zipファイルの中身を確認する場合は、unzipコマンドで「-l」オプションを使用すると良いだろう。

unzip -l 対象となるzipファイルのPATH

[root@test-centos7 ~]# unzip -l /tmp/test1.zip
Archive:  /tmp/test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      457  11-17-2015 06:02   work3/test1.py
     3261  11-17-2015 06:02   work3/test10.py
     1567  11-17-2015 06:02   work3/test11.py
     4450  11-17-2015 06:02   work3/test12.py
      682  11-17-2015 06:02   work3/test13.py
      505  11-17-2015 06:02   work3/test14.py
      347  11-17-2015 06:02   work3/test15.py
      232  11-17-2015 06:02   work3/test16.py
     1983  11-17-2015 06:02   work3/test17.py
      649  11-17-2015 06:02   work3/test18.py
      904  11-17-2015 06:02   work3/test19.py
---------                     -------
    15037                     11 files

7.既存のzipファイルにファイルを追加・更新する

既存のzipファイルに対して、ファイルを追加する場合はオプション無しで追加・更新が可能である。

[root@test-centos7 ~]# zip -r /tmp/test1.zip /work3/ -i *test1?.py
  adding: work3/test10.py (deflated 73%)
  adding: work3/test11.py (deflated 59%)
  adding: work3/test12.py (deflated 71%)
  adding: work3/test13.py (deflated 60%)
  adding: work3/test14.py (deflated 45%)
  adding: work3/test15.py (deflated 35%)
  adding: work3/test16.py (deflated 29%)
  adding: work3/test17.py (deflated 66%)
  adding: work3/test18.py (deflated 43%)
  adding: work3/test19.py (deflated 57%)
[root@test-centos7 ~]# zip -r /tmp/test1.zip /work3/ -i *test1*.py
updating: work3/test10.py (deflated 73%)
updating: work3/test11.py (deflated 59%)
updating: work3/test12.py (deflated 71%)
updating: work3/test13.py (deflated 60%)
updating: work3/test14.py (deflated 45%)
updating: work3/test15.py (deflated 35%)
updating: work3/test16.py (deflated 29%)
updating: work3/test17.py (deflated 66%)
updating: work3/test18.py (deflated 43%)
updating: work3/test19.py (deflated 57%)
  adding: work3/test1.py (deflated 51%)

変動のあったファイルのみを置き換えるする(新規追加もしない)場合は、「-f」オプションを、変動のあったファイルおよび新規のファイルのみを追加する場合は「-u」オプションを付与する。

zip -f 対象となるZIPファイルPATH 圧縮対象PATH ... # 変動のあったファイルのみ置き換える(新規ファイルは追加しない)
zip -u 対象となるZIPファイルPATH 圧縮対象PATH ... # 変動のあったファイルおよび新規ファイルを更新・追加する

[root@test-centos7 ~]# zip -r /tmp/test1.zip /work3/ -i *test1*.py
  adding: work3/test1.py (deflated 51%)
  adding: work3/test10.py (deflated 73%)
  adding: work3/test11.py (deflated 59%)
  adding: work3/test12.py (deflated 71%)
  adding: work3/test13.py (deflated 60%)
  adding: work3/test14.py (deflated 45%)
  adding: work3/test15.py (deflated 35%)
  adding: work3/test16.py (deflated 30%)
  adding: work3/test17.py (deflated 66%)
  adding: work3/test18.py (deflated 43%)
  adding: work3/test19.py (deflated 57%)
[root@test-centos7 ~]#
[root@test-centos7 ~]# echo "aaaaa" >> /work3/test12.py
[root@test-centos7 ~]# zip -fr /tmp/test1.zip /work3/ -i *test*.py
freshening: work3/test12.py (deflated 71%)
[root@test-centos7 ~]#
[root@test-centos7 ~]# echo "aaaaa" >> /work3/test16.py
[root@test-centos7 ~]# zip -ur /tmp/test1.zip /work3/ -i *test*.py
updating: work3/test16.py (deflated 31%)
  adding: work3/test.py (deflated 65%)
  adding: work3/test2.py (deflated 63%)
  adding: work3/test20.py (deflated 50%)
  adding: work3/test21.py (deflated 70%)
  adding: work3/test22.py (deflated 25%)
  adding: work3/test23.py (deflated 57%)
  adding: work3/test3.py (deflated 69%)
  adding: work3/test4.py (deflated 71%)
  adding: work3/test5.py (deflated 62%)
  adding: work3/test6.py (deflated 72%)
  adding: work3/test7.py (deflated 42%)
  adding: work3/test8.py (deflated 64%)
  adding: work3/test9.py (deflated 84%)

8.既存のzipファイルから一部を削除する

既存のzipファイルから中のファイルを一部削除する場合、zipコマンドで「-d」オプションを用いる。

zip -d 対象となるzipファイルのPATH -d 削除対象ファイルのPATH

[root@test-centos7 ~]# unzip -l /tmp/test1.zip
Archive:  /tmp/test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      457  11-17-2015 06:02   work3/test1.py
     3261  11-17-2015 06:02   work3/test10.py
     1567  11-17-2015 06:02   work3/test11.py
      694  11-18-2015 05:06   work3/test13.py
      347  11-17-2015 06:02   work3/test15.py
      244  11-18-2015 05:08   work3/test16.py
     1983  11-17-2015 06:02   work3/test17.py
      649  11-17-2015 06:02   work3/test18.py
      904  11-17-2015 06:02   work3/test19.py
---------                     -------
    10106                     9 files
[root@test-centos7 ~]# zip -d /tmp/test1.zip work3/test1{6,7,8}.py
deleting: work3/test16.py
deleting: work3/test17.py
deleting: work3/test18.py
[root@test-centos7 ~]# unzip -l /tmp/test1.zip
Archive:  /tmp/test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      457  11-17-2015 06:02   work3/test1.py
     3261  11-17-2015 06:02   work3/test10.py
     1567  11-17-2015 06:02   work3/test11.py
      694  11-18-2015 05:06   work3/test13.py
      347  11-17-2015 06:02   work3/test15.py
      904  11-17-2015 06:02   work3/test19.py
---------                     -------
     7230                     6 files

9.指定したファイル・ディレクトリのみを解凍する

zipファイルの中から、意図したファイルやディレクトリのみを解凍する場合は、unzipコマンドで引数としてファイルPATHを指定してあげればいい。
なお、ディレクトリの場合は再帰的に解凍出来ないので、ワイルドカード付きで指定する必要がある。

unzip 対象となるzipファイルのPATH 解凍するファイル・ディレクトリPATH

[root@test-centos7 ~]# unzip -l /tmp/test1.zip
Archive:  /tmp/test1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      457  11-17-2015 06:02   work3/test1.py
     3261  11-17-2015 06:02   work3/test10.py
     1567  11-17-2015 06:02   work3/test11.py
      694  11-18-2015 05:06   work3/test13.py
      347  11-17-2015 06:02   work3/test15.py
      904  11-17-2015 06:02   work3/test19.py
       67  11-17-2015 05:01   work/TEST1.sh
      141  11-17-2015 05:04   work/TEST2.sh
      150  11-17-2015 05:14   work/TEST3.sh
       75  11-17-2015 05:18   work/TEST4.sh
       67  11-17-2015 05:17   work/TESTr.sh
---------                     -------
     7730                     11 files
[root@test-centos7 ~]# unzip /tmp/test1.zip work3/test10.py
Archive:  /tmp/test1.zip
  inflating: work3/test10.py
[root@test-centos7 ~]# unzip /tmp/test1.zip work/*
Archive:  /tmp/test1.zip
  inflating: work/TEST1.sh
  inflating: work/TEST2.sh
  inflating: work/TEST3.sh
  inflating: work/TEST4.sh
  inflating: work/TESTr.sh

10.高圧縮率 or 高速圧縮にする

zipコマンドでは、(そんなに変わらないけど)オプションによって圧縮率を変動させることが出来る。

  • -0 … 無圧縮(ただまとめただけ)
  • -1 … 圧縮率は低いが高速
  • -9 … 圧縮率は高いが低速

[root@test-centos7 ~]# ls -ls /work3/test1*.py | awk '{sum = sum + $6} END {print sum}'
15067
[root@test-centos7 ~]# zip -0 /tmp/test-0.zip /work/test1*.py
  adding: work/test1.py (stored 0%)
  adding: work/test10.py (stored 0%)
  adding: work/test11.py (stored 0%)
  adding: work/test12.py (stored 0%)
  adding: work/test13.py (stored 0%)
  adding: work/test14.py (stored 0%)
  adding: work/test15.py (stored 0%)
  adding: work/test16.py (stored 0%)
  adding: work/test17.py (stored 0%)
  adding: work/test18.py (stored 0%)
  adding: work/test19.py (stored 0%)
[root@test-centos7 ~]# zip -1 /tmp/test-1.zip /work/test1*.py
  adding: work/test1.py (deflated 51%)
  adding: work/test10.py (deflated 69%)
  adding: work/test11.py (deflated 57%)
  adding: work/test12.py (deflated 68%)
  adding: work/test13.py (deflated 57%)
  adding: work/test14.py (deflated 44%)
  adding: work/test15.py (deflated 35%)
  adding: work/test16.py (deflated 28%)
  adding: work/test17.py (deflated 64%)
  adding: work/test18.py (deflated 43%)
  adding: work/test19.py (deflated 55%)
[root@test-centos7 ~]# zip -9 /tmp/test-9.zip /work/test1*.py
  adding: work/test1.py (deflated 51%)
  adding: work/test10.py (deflated 73%)
  adding: work/test11.py (deflated 59%)
  adding: work/test12.py (deflated 71%)
  adding: work/test13.py (deflated 60%)
  adding: work/test14.py (deflated 45%)
  adding: work/test15.py (deflated 35%)
  adding: work/test16.py (deflated 29%)
  adding: work/test17.py (deflated 66%)
  adding: work/test18.py (deflated 43%)
  adding: work/test19.py (deflated 57%)
[root@test-centos7 ~]# ls -la /tmp/test-*
-rw-r--r--. 1 root root 16773 11月 18 05:49 /tmp/test-0.zip
-rw-r--r--. 1 root root  7547 11月 18 05:49 /tmp/test-1.zip
-rw-r--r--. 1 root root  7117 11月 18 05:49 /tmp/test-9.zip

上の例を見るとわかるように、それぞれのオプションによってzipファイルの容量が異なっている。
無圧縮においてはむしろ容量が増えているような状態だ。

基本的には、時間を掛けたくない場合は「-1」を、そんなに圧縮率は変わらないが、ある程度容量を抑えたい場合は「-9」を付与すればよいだろう。

11.zipファイルの解凍テストを行う

ファイルの解凍を実際に行わず、動作テストのみを行う場合はunzipコマンドで「-t」オプションを付与する。

unzip -t 対象となるzipファイルのPATH

[root@test-centos7 ~]# unzip -t /tmp/test1.zip
Archive:  /tmp/test1.zip
    testing: work3/test1.py           OK
    testing: work3/test10.py          OK
    testing: work3/test11.py          OK
    testing: work3/test13.py          OK
    testing: work3/test15.py          OK
    testing: work3/test19.py          OK
    testing: work/TEST1.sh            OK
    testing: work/TEST2.sh            OK
    testing: work/TEST3.sh            OK
    testing: work/TEST4.sh            OK
    testing: work/TESTr.sh            OK
No errors detected in compressed data of /tmp/test1.zip.
[root@test-centos7 ~]# ls -la work{,3}/
ls: work/ にアクセスできません: そのようなファイルやディレクトリはありません
ls: work3/ にアクセスできません: そのようなファイルやディレクトリはありません