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
  • ただ,普通の用途であればどちらでもできるが,たまに片方でしかできないこともあるので両方使えると良い

ファイルのダウンロード

$ 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で確認しなさい.ただし,ファイルを手元に保存することなく確認すること.
curlwgetの両方で行うこと.


解答

$ 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

curlwgetも標準エラー出力に途中経過を書き出すのでlessの表示がお
かしくなるがrを押して 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 はファイルをまとめる

    • tarcpio など
  • Zip や 7-Zip は両方の機能を合わせ持つ

    • ただ, Zip や 7-Zip は Unix にあって Windows にはないファイル属性が欠落するので Unix ではあまり使われない

Compressor と Archiver 2

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

  • Archiver は tar は最もよく使われる

  • Compressor は gzipbzip2 が一般的

    • xz もよく使われるが,gzipbzip2に比べると使われる場面は減る

tarの使い方 1

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

tarの使い方 2

$ cd ~/Library
$ tar c Logs > ~/Desktop/logs.tar
$ cd ~/Desktop
$ cat logs.tar|tar x
  • 展開の時はファイル名を省略するとすべて展開される

tarの使い方 2

$ 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を付けることで標準出力に結果を出力できるようになる

例:

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

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

  • ファイルを配るときにはtarで一つにまとめてから Compressor で圧縮して配るのでよく組み合わせて使われる
$ 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

  • あまりにもよく使うのでパイプを明示的に書かなくても省略記法が存在する
$ cd ~/Library
$ tar czf ~/Desktop/logs-compressed.tar.gz Logs
$ cd ~/Desktop
$ tar xzf logs-compressed.tar.gz
  • zをつけることでgzip圧縮を行う
  • jbzip2Jxz
  • その他の圧縮形式はパイプで使う

tarの拡張機能

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

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

課題

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


解答

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

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


余談 1

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

余談 2

  • ファイルの拡張子が失われて,ファイル形式が分からなくなった場合には fileコマンドが便利
    • たまに間違うので鵜呑みにしないこと
    • ファイルの先頭にある Magic Number で判別している
$ 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 で圧縮,展開を行う
  • パイプを使うことで様々な処理を組み合わせられる