UNIX講習会#3 ダウンロード・圧縮ファイル編


# 第1部：ダウンロード

---

## ダウンロード 1

* ダウンロードには`curl`もしくは`wget`を使う
  * `curl`: OS X/Cent OS 標準搭載
  * `wget`: `curl`に比べて高機能
* どちらを使っても良い
  * OS Xで`wget`を使いたい場合はインストールが必要
  * MacPorts なら `sudo port install wget`
  * Homebrew なら `sudo brew install wget`
* ただ，普通の用途であればどちらでもできるが，たまに片方でしかできないこともあるので両方使えると良い

---

## ファイルのダウンロード

```bash
$ wget http://www.ring.gr.jp/archives/GNU/gzip/gzip-1.6.tar.xz
$ curl -O http://www.ring.gr.jp/archives/GNU/gzip/gzip-1.6.tar.xz
```

* `curl`でファイルをディスクに保存するときには`-O`が必要
  * 標準では標準出力に書き出すため
  * ファイル名を指定するときには`-o FILENAME`
* `wget`は標準ではURLから判断されたファイル名に書き出す
  * ファイル名を変えたければ`-O FILENAME`
  * 標準出力は`-O -`

---

## 課題

`ftp://ftp.hgc.jp/pub/mirror/ncbi/snp/00readme.txt`の内容を`less`で確認しなさい．ただし，ファイルを手元に保存することなく確認すること．
`curl`と`wget`の両方で行うこと．

---

## 解答

```base
$ curl ftp://ftp.hgc.jp/pub/mirror/ncbi/snp/00readme.txt|less
$ wget -O - ftp://ftp.hgc.jp/pub/mirror/ncbi/snp/00readme.txt|less
```

`curl`も`wget`も標準エラー出力に途中経過を書き出すので`less`の表示がお
かしくなるが<kbd>r</kbd>を押して Refresh してあげれば直る．

---

# 第2部：圧縮ファイル

---

## 圧縮ファイルの種類

|名前 |拡張子|特徴              |
|:----|:-----|:-----------------|
|Zip  |.zip  |一般的．人に渡すファイルはこれにしておくのが無難|
|7Zip|.7z   |高圧縮率          |
|gzip |.gz   |Unix では一般的   |
|bzip2|.bz2  |gzip より高圧縮率だが，遅い |
|lzop |.lzo  |gzip より早いが，圧縮率は若干劣る|
|xz   |.xz   |bzip2 より高圧縮率．展開はgzip並の速度だが圧縮はかなり遅い|

---

## Compressor と Archiver 1

* Unix では Compressor と Archiver を明確に区別する
* Compressor は圧縮のみを行う
  * `gzip` / `bzip2` はこちら
* Archiver はファイルをまとめる
  * `tar` や `cpio` など


* Zip や 7-Zip は両方の機能を合わせ持つ
  * ただ， Zip や 7-Zip は Unix にあって Windows にはないファイル属性が欠落するので Unix ではあまり使われない

---

## Compressor と Archiver 2

* ファイルをまとめて圧縮するためには Archiver で1ファイルにまとめてから Compressor で圧縮するのが一般的


* Archiver は `tar` は最もよく使われる
* Compressor は `gzip` や `bzip2` が一般的
  * `xz` もよく使われるが，`gzip`や`bzip2`に比べると使われる場面は減る

---

## `tar`の使い方 1

* 基本的な使い方
  * `tar COMMAND FILES...`
* `COMMAND`は以下の通り
  * `x`: 展開 (Extract)
  * `c`: 作成 (Create)
  * `t`: リストを表示 (List)
  * 最低一つは指定する．`-`はいらない
* `FILES`は格納，もしくは展開したいファイル名を指定する
  * アーカイブのファイル名ではない
* アーカイブのデータはデフォルトでは標準入出力から

---

## `tar`の使い方 2

例

```bash
$ cd ~/Library
$ tar c Logs > ~/Desktop/logs.tar
$ cd ~/Desktop
$ cat logs.tar|tar x
```

* 展開の時はファイル名を省略するとすべて展開される

---

## `tar`の使い方 2

例

```bash
$ cd ~/Library
$ tar cf ~/Desktop/logs.tar Logs
$ cd ~/Desktop
$ tar xf logs.tar
```

* コマンドに`f`を指定すると標準入出力でなくファイル名を指定してアーカ
  イブを読み書きできる
* `f`は必ずコマンドの最後に指定すること
  * 最近の実装は大丈夫だが，いけてない実装だと`f`の直後からファイル名だと解釈される場合がある
  
---

## Compressor の使い方 1

* `gzip`, `bzip2`, `xz`, `lzop`はどれもだいたい同じオプションを持つ
* 基本的な使い方
  * 圧縮 `gzip FILENAME`
  * 伸長 `gzip -d FILENAME.gz`
* どれも元のファイルを削除するので要注意！
  * `-k`を付けるとことで削除しないこともできるが，`gzip`がバージョンによっては対応していないことがある

---

## Compressor の使い方 2

* Compressor もフィルタとして動作できるように設計されている
* `-c`を付けることで標準出力に結果を出力できるようになる

例：

```bash
$ cd ~/Desktop
$ gzip -c logs.tar > logs.tar.gz
$ cat logs.tar.gz|gzip -dc > uncompressed-logs.tar
```

---

## `tar`と圧縮を組み合わせる 1

* ファイルを配るときには`tar`で一つにまとめてから Compressor で圧縮して配るのでよく組み合わせて使われる

```bash
$ cd ~/Library
$ tar c Logs|gzip -c > ~/Desktop/logs-compressed.tar.gz
$ cd ~/Desktop
$ cat logs-compressed.tar.gz|gzip -dc|tar x
```

---

## `tar`と圧縮を組み合わせる 2

* あまりにもよく使うのでパイプを明示的に書かなくても省略記法が存在する

```bash
$ cd ~/Library
$ tar czf ~/Desktop/logs-compressed.tar.gz Logs
$ cd ~/Desktop
$ tar xzf logs-compressed.tar.gz
```

* `z`をつけることで`gzip`圧縮を行う
* `j`で`bzip2`，`J`で`xz`
* その他の圧縮形式はパイプで使う

---

## `tar`の拡張機能

`tar`はいくつか実装があり，独自の拡張機能がある場合がある

* OS X には BSD 由来の tar が搭載されている
  * 展開時には圧縮形式のコマンドを省略可能
  * 自動判別はファイル名によらないのでパイプ経由でも OK
  * Zip や ISO ファイルも作ったり展開したりできる
* Linux に多くの場合 GNU tar が搭載されている
  * 圧縮・展開時には`a`をコマンドに指定することでファイル名から自動判別される

---

## 課題

`http://tukaani.org/xz/xz-5.2.1.tar.bz2`にあるファイルをダウンロードフォルダに展開しなさい．ただし，展開前のファイルを一度ローカルに保存してはならないものとする．

---

## 解答

```bash
$ curl http://tukaani.org/xz/xz-5.2.1.tar.bz2|bzip2 -dc|tar x
```

普通は手元に一度保存してからやる場合が多いです．こういうことはできるけどあまりしない

---

## 余談 1

* Zip の圧縮展開には`zip`，`unzip`コマンドが使える
* 7-Zip の圧縮展開には`7z`コマンドが使える
  * インストールされていなければ`sudo port install p7zip`
  * `7z`は Zip も作れて，普通の Zip 展開ソフトで展開できるが `zip`コマンドを使うより圧縮率は高い
* 圧縮形式は他にもいろいろある
  * `lzip`, `compress`, `rzip`とか
  * 一長一短だが人に配るときには`gzip`, `bzip2`が無難

---

## 余談 2

* ファイルの拡張子が失われて，ファイル形式が分からなくなった場合には
  `file`コマンドが便利
  * たまに間違うので鵜呑みにしないこと
  * ファイルの先頭にある Magic Number で判別している

```bash
$ file zlib-1.2.8.tar.xz
zlib-1.2.8.tar.xz: xz compressed data
$ file fastqc_v0.11.3_source.zip
fastqc_v0.11.3_source.zip: Zip archive data, at least v2.0 to extract
$ file pypy-2.5.1-centos6.tar.bz2
pypy-2.5.1-centos6.tar.bz2: bzip2 compressed data, block size = 900k
```

---

## まとめ

* ファイルのダウンロードには `curl` もしくは `wget` を使う
* Archiver と Compressor は違う
* 普段は `tar` で圧縮，展開を行う
* パイプを使うことで様々な処理を組み合わせられる