UNIX for Bioinformatics

4. コマンド(応用編)

このページでは、覚えておかなくてもよいが、知っておいた方がいいというコマンドや UNIX システムの概念などを紹介する。これらのコマンドも把握しておくことで、さらなる効率化が期待できる。

圧縮と解凍

データが大きいとき、共同研究者間で圧縮したものでやりとりするとスムーズである。データを圧縮する方法として、ZIP、GZIP、BZIP などがある。ZIP は、様々なファイルやディレクトリを圧縮するために一般的によく使われている。GZIP および BZIP はテキストデータに対する圧縮率が非常に大きいので、テキストデータを貯蓄されているデータベースでよく使われている。例えば、GenBank、Ensembl や SRA などでは大きなデータを GZIP あるいは BZIP で配布していることが多い。

ZIP

ZIP は、データあるいはディレクトリそのものを圧縮できる。ZIP の圧縮は zip コマンドを利用する。例えば、data ディレクトリの中にある ft.fa ファイルを圧縮するには、次のようにする。この際に、圧縮後のファイル名を先に書いてから、圧縮対象ファイルのパスを書く。順序を逆にすると、元のデータがなくなってしまうため、十分に注意すること。

ZIP 形式で圧縮されたファイルを解凍するには、unzip コマンドを使用する。ディレクトリにすでに同様な名前のファイルが存在する場合は、上書きするかどうかを聞いてくるため、y, n, A, N, r のいずれかのキーを入力して、解凍を続ける。

なお、ディレクトリの圧縮はオプション -r を付けて実行する。

GZIP

GZIP はファイルの圧縮形式である。ZIP とは異なり、GZIP はファイルのに適用できる。ファイルを圧縮するときは、gzip コマンドを使用する。圧縮後のファイルの拡張子は .gz あるいは .gzip になる。次のコマンドを実行してから、ls コマンドを実行して、ディレクトリの中を確認してみてください。

GZIP で圧縮されたファイルを解凍するには、gzip コマンドに -d オプションを付けて実行する。解凍後、拡張子 .gz が外れる。

データベースで配布されているゲノムのファイルは、圧縮後でも数ギガバイトに及ぶことがある。このようなゲノムデータを確認するとき、解凍して、内容を確認してから、もう一度圧縮するのは効率がわるい。そこで、ファイルを完全に展開せず、少しずつ展開して内容を確認することができる。gzip -d コマンドにさらに -c オプションを付けると、解凍後の情報が画面上に出力される。このとき、パイプを利用して、head コマンド、grep コマンドや less コマンドを利用すれば、ファイルを展開しながら内容を確認できるようになる。

あるディレクトリ全体を圧縮するとき、後で紹介する tar コマンドを利用する。

BZIP2

BZIP2 は GZIP に似せて作られているため、その使い方は GZIP とほぼ同じである。BZIP2 は、GZIP より圧縮率が高いものの、実行速度が遅いのが特徴である。BZIP2 の圧縮と解答は bzip2 コマンドを使用する。なお、一部のシステムには bzip2 コマンドがインストールされていないので、必要に応じてこれをインストールするとよい。

TAR

TAR は圧縮形式ではなく、複数のディレクトリやファイルなどを取りまとめてアーカイブ化するものである。アーカイブすることによって、それらのディレクトリやファイルが見かけ上 1 つのファイルになるので、バックアップしたり、メールに添付したりしやすくなる。コマンドとして tar-cf オプションを付けて使う。

アーカイブ化されたファイルは、オプション -xf を使って展開することができる。

アーカイブ化はデータを見かけ上 1 つのファイルにまとめる操作である。したがって、ファイルが圧縮されていなく、ファイルサイズが大きいままである。そこで、そのアーカイブをさらに GZIP または BZIP で圧縮することができる。たとえば、gzip コマンドで圧縮すると、data.tar.gz ファイルができる。

圧縮されたアーカイブを展開するには、まず解凍してからアーカイブを展開する。

アーカイブと圧縮が一般的に利用されている。そのため、targzip コマンドを使うこともできるが、tar コマンド 1 つだけてアーカイブと圧縮を同時に行ってくれるオプションも用意されている。ファイルの拡張子は .tar.gz または略して .tgz にすることが多い。

ここでは targzip コマンドの組み合わせを紹介した。実際に、tarbzip2 コマンドもまったく同様に使える。

ファイル検索

ファイル名で検索

CLI 操作でファイルの検索を行うこともできる。ファイル名で検索したり、あるいはファイル名の一部を指定して、パターンマッチで検索したりすることができる。例えば、data ディレクトリの下にある iris.csv ファイルを検索する場合は次のようにする。

また、data ディレクトリの下にある .txt で終わるファイルを調べる場合は次のようにする。

ファイル名に特定のパターンを含まないようなファイルを検索する際に ! を付ける。

条件が複数ある場合は、次のように OR または AND 演算子で検索できる。例えば、data ディレクトリにある拡張子が .csv または .txt のファイルを検索するには次のように -o オプションで OR 検索する。

AND 検索は -a オプションで行う。次は、ファイル名が leaf から始まり、かつ .fastq で終わるものを検索する例である。

ファイルの更新日で検索

find コマンドのオプション -mtime-atime-ctime オプションが用意されている。これらのオプションを使用することで、最近更新したファイルを検索することができる。例えば、data フォルダの下に、最近 3 日に内容を更新したファイルを調べるには、次のようなコマンドを実行する。

上で -3 を指定しているのに注意すること。マイナスをつけずにそのまま 3 を指定すると、3 日前(72 時間前から 96 時前間までの間)に更新したファイルが検索される。また、例えば、3 日以内に更新したファイルのうち、拡張子が .txt のファイルを検索するには、次のように -a オプションで AND 検索すればよい。

なお、mtime、atime、ctime はファイルスタンプの種類であり、UNIX システム上で保存されているファイルに付けられる属性である。

ファイルスタンプ意味
mtimemodify time最終変更時刻。 ファイルの内容が変更されたときに日時情報が更新される。
atimeaccess time最終アクセス時刻。ファイルに対して cpcat コマンドを実行したときに、そのファイルの日時情報が更新される。
ctimechange time最終ステータス変更時刻。 ファイルへの書き込みを行ったときやファイルのパーミッションを変更したときに日時情報が更新される。

検索の深さ指定

ディレクトリの深さを指定して、ファイルの検索を行うこともできる。特定の深さに対してのみを検索するときはオプション -depth を使用する。また、現在のディレクトリから指定した深さまで検索するときはオプション -maxdepth を使い、現在のディレクトリから見たとき指定した深さ以下にあるディレクトリに対して検索するときはオプション mindepth を使う。

パーミッション

パーミッションは権限のことである。UNIX システム上のすべてのディレクトリおよびファイルにはパーミッションが付けられている。パーミッションは実行権と所有権で構成されている。実行権は、読み取り、書き込み、実行の 3 種類の権限が組み合わせで表せる。それぞれの権限には記号あるいはそれに相当する整数が割り当てられている。

実行権記号整数
読み取り可能 (readable)r4
書き込み可能 (writable)w2
実行可能 (executable)x1
権限なし-0

ディレクトリまたはファイルの権限は、rwx のような記号あるいは 7 のような整数で表すことができる。例えば、読み書きかつ実行が可能なファイルならば、その権限は rwx あるいは 7 で設定されている。7 は readable + writable + executable = 4 + 2 + 1 により計算される値である。また、読みと実行が可能で、書き込みが不可なファイルの権限ならば、r-x あるいは 5 で設定されている。5 は readable + executable = 4 + 1 で計算される値である。

パーミッションを構成するもう一つの所有権は 3 種類ある。これまで説明した実行権を「誰に」対してつけるのかを指定するために、所有権が使われる。この 3 種類の所有権は、自分(owner)、グループ(group)、および他人(other)である。

所有権と実行権を組み合わせたパーミッションを説明するために、次のような場面を考える。スパコンは多数のユーザーによって使われている。自分がスパコン上で作成したプログラムを、同一スパコン上にある共同研究者に共有したいとする。このプログラムを、自分でいつでも修正できて、実行できるようにしたい。しかし、共同研究者には読み取りと実行を許可するが、修正・変更できないようしたい。このような場合は、自分には実行権 7 を付けて、共同研究者には実行権 5 を付ける必要がある。一方で、自分と共同研究者以外の(スパコン上にいる)赤の他人にはプログラム自体を見せたくないので、そのような人には実行権 0 を付ける必要がある。ここでいう自分は所有権 owner のことであり、共同研究者は group のことであり、赤の他人は other のことである。そして、owner、group、other それぞれにに対して実行権 7、5、0 を付けたい。このとき、そのプログラムファイルの権限を 750 に設定すればよい。

ファイルあるいはディレクトリのパーミッションを確認するには、ls コマンドに -l オプションを付けることで、確認できる。試しに unix4bi ディレクトリの中のディレクトリ、および unix4bi の中にある samples ディレクトリの中にあるファイルのパーミッションを確認してみる。

これらの出力結果を見ると、ファイルあるいはディレクトリの先頭に -rw-r--r-- や drwxr-xr-x などの記号を確認できる。これらの文字列がパーミッションを表している。-rw-r--r-- などの記号は 10 文字からなる。先頭の文字は d または - である。d ならばディレクトリを意味し、- ならばファイルを意味する。残りの 9 文字は、rw-、r--、r-- の3 文字ずつに分解でき、それぞれが owner、group、other に対する実行権となっている。

例えば -rw-r--r-- はファイルで、自分に対する権限は読み書きが可能で実行は不可、自分と同じグループに入っているユーザー(共同研究者)や他人は読み取りのみが可能となっている。上の例にはないが、例えば -rwxr-x--- ならば、これはファイルで、owner、group、other に対する権限がそれぞれ rwx、r-x、--- となっている。つまり、このファイルに対して、自分は読み書きかつ実行できるが、自分と同じグループの人は読み取りおよび実行しかできない。また、赤の他人は、このファイルの内容を見ることさえできないことになっている。

ls -l の実行結果のうち、パーミッションの右側には donguri および staff の文字列が見られる。これは、このファイルあるいはフォルダの owner は donguri であり、group が staff となっていることを意味する。例えば、ファイルのパーミッションが -rwx-r----- ならば、donguri と同じグループ staff に入っているユーザーならば、このファイルの内容を読むことができる。

あるファイルあるいはディレクトリのパーミッションを変更するとき chmod コマンドを使う。例えば、samples ディレクトリの中の murphys_law.txt ファイルのパーミッションを 750 に設定したいとき、次のようにする。

ディレクトリに対しても同様に行える。

しかし、この場合は、ディレクトリのパーミッションが 750 に変更されるが、そのディレクトリの下にあるファイルのパーミッションは変更されない。ディレクトリとその下にあるファイルをすべて一括に 750 に変更したい場合は、次のように -R オプションを利用する。

group の概念を使うためには、自分と共同研究者を同じグループに設定する必要がある。この設定はスパコンの管理者しか行えない。したがって、データあるいはプログラムを共有したい場合は、スパコンの管理者に相談し、同じグループになるように設定してもらう必要がある。

また、1 つのユーザーは複数のグループに属することができる。例えば、A、B、C ユーザーが alphabet グループに、A, X, Y ユーザーが alphazero グループになるように設定できる。このとき、A は B および C とデータ共有でき、また X および Y ともデータ共有できる。しかし、B・C と X・Y は互いに赤の他人状態である。

リンク

リンクは、ショートカットのようなものである。本来は、コンピュータの特定のディレクトリにあるデータを、自分のディレクトリにあるかのように使いたいとき、そのデータを自分のホームディレクトリをコピーしてくる必要がある。しかし、データが大きいとき、同じようなデータが 2 箇所置かれることになり、ディスク容量を消費する上で、2 箇所のデータのどれが最新なのかを把握できなくある。

そこで、データをまるごとコピーするのではなく、そのデータのディレクトリを見かけ上、自分のディレクトリにあるように置くことができるようになる。このようなものをリンクと呼ぶ。リンクを付けるには ln コマンドを使う。使い方として、ln コマンドに -s オプションを付ける。続けて、データが存在しているパスを指定して、そのあとにリンクの名前を書く。初心者にとって、リンクの概念が難しいので、すぐに理解できなくてもよい。

次は、projects ディレクトリのリンクを projects2 という名前で、data ディレクトリの下に作成する例を示している。

リンクを作成すると、そのリンクは、見かけ上リンクもとと全く同じものになる。

エイリアス

エイリアスは別名・偽名の意味である。長いコマンドを短くしたりすることができる。例えば、ls コマンドはファイルの一覧しか表示しないが、ls -lh はファイルの一覧とファイルサイズなども出力されるため、ls -lh が多用される。ls -lh を毎回使用すると、煩雑であるため、この ls -lh と同じ機能を持つ新しいコマンド llh を作ることができる。

ジョブ制御

ジョブ実行中に、ジョブを中断することができる。ジョブの中断は SIGINT と SIGSTP の 2 種類がある。SIGINT は、割り込みと呼ばれるもので、現在実行しているジョブを一時停止することを意味する。一時停止したプログラムを後で再開せることができる。例えば、ノートパソコンで何かの重い計算を実行していて、途中で、アポなしミーティングに参加する必要がでてきたとする。このとき、現在の重たい計算を一時停止(SIGINT)して、軽くなったノートパソコンでミーティングに参加して、ミーティング後に計算を再開させることができる。これに対して、SIGSTP は処理そのものを中止するときに使う。例えば、処理対象のファイルを間違えたり、プログラムにバグがあることに気付き、計算そのものにはもう意味がなく、すぐに中止したい場合に使う。

実行中のジョブを一時停止(SIGINT)したい場合は、Ctrl キーを押しながら z キーを押す。これで、実行中のジョブが一時停止される。ジョブを一時停止した後に、ターミナルを終了しないようにしてください。

一時停止したジョブを再開するには、Ctrl + z を実行したターミナルで、 fg コマンドを実行すれば、ジョブが再開される。

実行中のジョブを完全に中止(SIGSTP)したいときは、Control キーを押しながら c キーを押す。これで、実行中のジョブが完全に停止される。

なお、Ctrl + c でプログラムを終了できない場合、そのプログラムが入力待ち受け状態になっている可能性がある。このとき、Control キーを押しながら d キーを押してください。これで入力待ち受け状態から抜ける。その後、必要あれば、Ctrl + c でプログラムを終了させることができる。

nohup

nohup コマンドは、実行時間の長いジョブを実行するときに使うと便利なコマンドである。スパコンあるいは研究所のクラスタコンピュータで数日かかるような処理を行う場合、ターミナルからそのままコマンドを入力して処理を行うと、処理中にずっとそのターミナルをスパコンあるいはクラスタに接続した状態で保持する必要がある。スパコンあるいはクラスタに数日間接続し続けるのは非現実的で、かつセキュリティー上にもよくない。

nohup コマンドは、接続が切断され、ターミナルを閉じられも計算を続けるようにするコマンドである。その使い方として、本来実行したいコマンドを、 nohup& 囲むだけである。例えば、普通であれば、ディレクトリの一覧を出力するコマンドは次のように実行できる。

このコマンドを nohup で実行するには、次のように、ls -alhnohup& で囲むだけでよい。

デフォルトでは、実行結果は nohup.out ファイルに保存される。

別の例をもう一回見てみる。例えば hisat2 というコマンドは次のように使うとする。

このコマンドを nohpu で実行する場合は、次のようにする。

nohup コマンドを利用すれば、スパコンあるいはクラスタに常に接続しなくてもジョブを実行し続けることができる。非常に便利だが、nohup で実行するジョブが多すぎると、システムリソースの消費量が把握できなくなるため、システム全体の動作が著しく遅くなる。この場合、同じシステム上にいる他のユーザーに迷惑をかけてしまう。そのため、小規模の研究室であれば、nohup の使用を認めてくれることはあるが、スパコンなどでは nohup の使用が禁止されている。いずれにせよ、nohup が使用できるかどうかをコンピュータの管理者に確認しておくと無難である。

screen

screen コマンドも長時間かかるようなジョブを実行するときに使うと便利なコマンドである。nohup コマンドでジョブを実行すると、ジョブの進行を確認できなくなる。ジョブのプロウス番号とジョブの出力などは nohpu.out に保存されるが、そのジョブを一時中止して再開したりすることができない。これに対して、screen コマンドでは、ジョブの実行画面をそのまま保持するようなイメージである。UNIX を初めて学ぶ人にとって難しいため、実際に UNIX システムを数年使用してから挑戦してみるとよい。

ネットワークから大型クラスタコンピュータ上でデータ解析の作業していると考えよう。このデータ解析の作業が特殊で、一連の解析を次々と行っておく必要があり、途中で止めると、最初から操作しなければならないものとする。データ解析のために、まず、自分のパソコンを立ち上げて、ターミナルを使ってクラスタに接続する。その後、そのターミナル上でコマンドを少しずつ実行していき、データを解析しいく。ここで、データ解析中に、急な用事ができたとする。このとき、ネットワークを切断して、その用事を済ませなければならない。その後、用事を済ませた後に、クラスタに再接続して、作業を再開しようとするが、今まで入力したコマンドをまた最初から入力しなければならなくなる。

screen コマンドを利用すると、この状況を回避できるようになる。まず、自分のパソコンからクラスタに接続する。接続後、すぐに screen コマンドを実行する。screen コマンドを実行した後に、普段通りにコマンドを実行し、データ解析を進める。途中で急に用事ができたとする。このとき、Control キーをしながら a キーを押してから両者を離して、続けて d キーを入力する(<Ctrl + a> + b)と、screen 状態から抜けられるようになる。この操作をデタッチとよぶ。デタッチすると、screen の状態から抜けるが、screen の本体はそのままスパコン上で存続している。用事を済ませた後に、screen -r を実行すると、再びさきほどデタッチした screen に接続できるようになり、それまでに行われた操作やそのときのターミナル画面がそのまま表示される。

screen コマンドは便利だが、とっつきにくい。興味あったら、使い方を調べてみてください。

特殊変数

一部の大文字で描かれる変数は、環境変数やシェル変数と呼ばれている。これらの変数は、システムが正しく動作する上で必要な変数であるため、不必要な変更を行わないようにしておくとよい。よく見かける変数には次のようなものがある。これ以外にも数十個以上存在するが、複雑な処理を書かなければ、ほとんど使うことがない。

変数動作
SHELL現在使用しているシェルの種類。
HOMEホームティレクトリのパス。
PATHコマンドのパス。
PWD現在のディレクトリのパス。

試しに、これらの変数の中身を echo コマンドで出力してみる。

 

 

CC BY 4.0