2018年以降の記事はGitHub Pagesに移行しました

Unixでファイル圧縮・解凍するときに使うコマンドをまとめた

あらすじ

不意に.Zファイルがやってきて解凍の仕方を調べてしまった。あとだいたいオプションを忘れるのでメモ。対象ファイルは以下。

  1. .zip
  2. .Z
  3. .gz
  4. .bz2
  5. .tar.gz
  6. .tgz
  7. .tar.bz2
  8. .tbz
  9. .tar.Z

こんなファイルを固めたり解凍したり。

extracted
┣direct/
┃┗ls.txt # man ls >> ls.txt
┣slink
┣tar.txt  # man tar >> tar.txt
┗zip.txt  # man zip >> zip.txt
tar
┗sample.tar
$ tar tvf sample.tar ../extracted
drwxr-xr-x 9999/9999      0 12月  8日 19:14 2011年 ../extracted/
lrwxrwxrwx 9999/9999      7 12月  8日 19:13 2011年 ../extracted/slink tar.txt へのシンボリックリンク
drwxr-xr-x 9999/9999      0 12月  8日 19:37 2011年 ../extracted/direct/
-rw-r--r-- 9999/9999  36890 12月  8日 19:37 2011年 ../extracted/direct/ls.txt
-rw-r--r-- 9999/9999  39133 12月  8日 19:07 2011年 ../extracted/tar.txt
-rw-r--r-- 9999/9999  40835 12月  8日 19:11 2011年 ../extracted/zip.txt

zip(unzip) 拡張子: zip

  • 圧縮
    • zip 圧縮後のファイル名 [ファイル ファイル]
$ zip ../compressed/c.zip *
  adding: direct/ (stored 0%)
  adding: slink (deflated 71%)
  adding: tar.txt (deflated 71%)
  adding: zip.txt (deflated 67%)
$ zip -r ../compressed/c.zip *
  adding: direct/ (stored 0%)
  adding: direct/ls.txt (deflated 75%)
  adding: slink (deflated 71%)
  adding: tar.txt (deflated 71%)
  adding: zip.txt (deflated 67%)
  • 解凍
    • unzip 解凍ファイル.zip -d 解凍パス
$ unzip ../compressed/c.zip -d ../compressed/output/zip/
Archive:  ../compressed/c.zip
   creating: ../compressed/output/zip/direct/
  inflating: ../compressed/output/zip/direct/ls.txt
  inflating: ../compressed/output/zip/slink
  inflating: ../compressed/output/zip/tar.txt
  inflating: ../compressed/output/zip/zip.txt

rでディレクトリの下も含めてまとめて。解凍時にdでパス指定

compress(uncompress) 拡張子: Z, tar.Z

  • 圧縮
    • compress -fv [ファイル ファイル]
$ compress -fv *
direct: 圧縮: 86.32% -- 通常ファイルではありません: 変更されていません。
slink: 圧縮: 60.13% -- slink.Z と置換しました。
tar.txt: 圧縮: 60.13% -- tar.txt.Z と置換しました。
zip.txt: 圧縮: 57.45% -- zip.txt.Z と置換しました。
$ compress -v sample.tar
sample.tar: 圧縮: 60.78% -- sample.tar.Z と置換しました。
  • 解凍
    • compress -dv [ファイル ファイル]
    • uncompress -v [ファイル ファイル]
$ compress -dv *
direct.Z: ファイルもディレクトリもありません。
slink.Z:  -- slink と置換しました。
tar.txt.Z:  -- tar.txt と置換しました。
zip.txt.Z:  -- zip.txt と置換しました
$ uncompress -v *
direct.Z: ファイルもディレクトリもありません。
slink.Z:  -- slink と置換しました。
tar.txt.Z:  -- tar.txt と置換しました。
zip.txt.Z:  -- zip.txt と置換しました。
$ compress -dv sample.tar.Z
sample.tar.Z:  -- sample.tar と置換しました。
$ uncompress -v sample.tar.Z
sample.tar.Z:  -- sample.tar と置換しました

そのファイル自体が置換される? fは強制(圧縮しても小さくならない、ファイルが既に存在する場合も上書き)、vは冗長、dは解凍?

gzip(gunzip) 拡張子: gz, tar.gz, tgz

  • 圧縮
    • gzip [ファイル ファイル]
$ gzip -rv *
direct/ls.txt:   75.2% -- replaced with direct/ls.txt.gz
slink:   71.3% -- replaced with slink.gz
tar.txt:         71.3% -- replaced with tar.txt.gz
zip.txt:         66.7% -- replaced with zip.txt.gz
$ gzip -v sample.tar
sample.tar:      72.2% -- replaced with sample.tar.gz
  • 解凍
    • gzip -d [ファイル ファイル]
    • gunzip [ファイル ファイル]
$ gzip -rdv *
direct/ls.txt.gz:        75.2% -- replaced with direct/ls.txt
slink.gz:        71.3% -- replaced with slink
tar.txt.gz:      71.3% -- replaced with tar.txt
zip.txt.gz:      66.7% -- replaced with zip.txt
$ gunzip -rv *
direct/ls.txt.gz:        75.2% -- replaced with direct/ls.txt
slink.gz:        71.3% -- replaced with slink
tar.txt.gz:      71.3% -- replaced with tar.txt
zip.txt.gz:      66.7% -- replaced with zip.txt
$ gzip -dv sample.tar.gz
sample.tar.gz:   72.2% -- replaced with sample.tar
$ gunzip -v sample.tar.gz
sample.tar.gz:   72.2% -- replaced with sample.tar

そのファイル自体が置換される? fは強制。vは冗長。dで解凍。

bzip2(bunzip2) 拡張子: bz2, tar.bz2, tbz

  • 圧縮
    • bzip2 [ファイル ファイル]
$ bzip2 -v *
bzip2: Input file direct is a directory.
  slink:    4.001:1,  1.999 bits/byte, 75.01% saved, 39133 in, 9780 out.
  tar.txt:  4.001:1,  1.999 bits/byte, 75.01% saved, 39133 in, 9780 out.
  zip.txt:  3.355:1,  2.384 bits/byte, 70.19% saved, 40835 in, 12171 out.
$ bzip2 -v sample.tar
  sample.tar:  4.165:1,  1.921 bits/byte, 75.99% saved, 121856 in, 29256 ou
t.
  • 解凍
    • bzip2 -d [ファイル ファイル]
    • bunzip2 [ファイル ファイル]
$ bzip2 -dv *
bzip2: Input file direct is a directory.
  slink.bz2:   done
  tar.txt.bz2: done
  zip.txt.bz2: done
$ bunzip2 -v *
bunzip2: Input file direct is a directory.
  slink.bz2:   done
  tar.txt.bz2: done
  zip.txt.bz2: done
$ bzip2 -dv sample.tar.bz2
  sample.tar.bz2: done
$ bunzip2 -v sample.tar.bz2
  sample.tar.bz2: done

そのファイル自体が置換される? fは強制。vは冗長。dで解凍。ディレクトリの下は指定しないとダメ?

圧縮結果(参考)

-rw-r--r--   1 test    test      47784 12月  8日  21:38 sample.tar.Z
-rw-r--r--   1 test    test      29256 12月  8日  21:41 sample.tar.bz2
-rw-r--r--   1 test    test      33934 12月  8日  21:21 sample.tar.gz

今回の結果だと、ファイルサイズはおおむね Z > gz > bz2 になっている。