Unixの基礎を概説します.
- Unix系OSとは
- Character-based User Interface とコマンド
- ディレクトリ構造
- 基礎的なコマンド
- cd, pwd, ls - ファイルシステム関係のコマンド
- man - マニュアルを出すコマンド
- mkdir - ディレクトリを作るコマンド
- mv - 名前を変更する/移動する
- rm - 削除するコマンド
- タブキー習慣
Unix系OSとは
色々と定義はありますが, ここではCommand-line User Interfaceを主に用いて解析する環境を持ったLinux, MacOS, Windows subsystem for linux などを対象とします.
Character-based User Interface とコマンド
普段コンピューターを使う際には, デスクトップから何らかのアプリケーションを起動して使っていることがほとんどだと思います. これは, コンピューターへの命令やフィードバックを視覚的に表現する方式でGraphical User Interface (GUI) と呼ばれています. GUIは直感的にコンピューターを操作できるため, 広く用いられています.
対立する概念のひとつとして, Character-based User Interface (CUI)があります. これは, 文字ベースでコンピューターと人間がやりとりする方法です. 映画マトリクッスの冒頭で, ネオが文字だけ表示されるコンピューターをいじくっていたシーンを想像してください. GUIは綺麗で便利ですが, 誰かがその機能を持ったソフトウェアを作っている必要があります. しかし, 私たちがやりたいことはそのようなレディメイドの操作ではなく, 私たちが私たちのためだけに開発した特定の操作 (計算) を実施するというものです. その際, GUIはあまり必要とはみなされていません. また, CUIで実施することで, 繰り返しや自動処理に大きな利点があります. 解析は, 主にCUIで実施します. (GUIも適宜使います.)
具体的には, 端末やターミナルと呼ばれるツールを使います. MacだとTerminal.app, WindowsだとWindows terminal などです.
これらはコマンドラインと呼ばれます. おそらく真っ白や真っ黒な画面が出てくるはずです.
起動すると, 何か文字を入力できる状態になっています. ここに何かしらの命令 (=コマンド) を入力してEnterキーを押せば, コンピューターが命令を実行します. コマンドとコンピューターの橋渡しとなっているのがシェル (Shell) と呼ばれるプログラムで, bash, zsh, tcsh, fish などの種類があります. あなたが普段使っているいかなるアプリの機能も, 実現しうる可能性をコマンドは持っています.
具体的にCUIで作業をする利点を実例を交えて紹介しましょう.
cal
と打ってエンターキーを押してみてください.
> cal
July 2022
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
カレンダーが表示されましたか? calの前の >
を入力する必要はありません. これはプロンプトと呼ばれて, ここからコマンドが入力できますよ, という目印です. 皆さんの環境によっては $
だったり, %
だったり, もっと色々書いてあったりするかもしれません.
次は date
を実行してください.
> date
Mon Jul 4 00:11:53 JST 2022
現在時刻が表示されましたか?
次はフォルダを作ってみましょう.
普通にGUIでやるならファイラーアプリケーションを開き, どこかを左クリックするなり, メニューを選択するなりして新規フォルダを作成などという欄を探します. その後, ファイルの名前を適切にするという流れが一般的かと思います.
コマンドラインでやる場合は非常に簡単で, mkdir
コマンドを使います.
> mkdir new_folder
> mkdir another_new_folder
どこをクリックするとかを探索する必要は全くありません. 慣れれば圧倒的にこちらの方が早くなると思います.
なんだこの程度かと思われたかもしれません. しかし, これらのコマンドの組み合わせによって, 様々なことが実行できるようになります.
例として写真の加工を示します.
実験の様子を写真に撮っておくことはよくあると思います. スライドやログに残すために, 写真を撮った日時をを画像に貼り付けて保存しておきたいことがたまにあります. これは, 任意のGUIアプリケーションを使って実現可能です. 例えば, MacOSだと標準でPreview.app というアプリケーションが用意されています.
この方法で文字を入力してもいいですが, 撮影時刻を自力で調べて書き写す必要があります. やりたい写真が何十枚, 何百枚とあると非常に面倒です. これは, CUIを利用することでシンプルに解決することができます.
exiftool
というコマンドが入っていれば, 写真のメタ情報を確認できます. (出力抜粋)
> exiftool photo1.jpeg
ExifTool Version Number : 12.42
File Name : photo1.jpeg
File Size : 4.4 MB
File Modification Date/Time : 2022:07:04 08:45:30+09:00
File Access Date/Time : 2022:07:04 08:46:11+09:00
File Permissions : -rw-r--r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
(略)
Shutter Speed : 1/60
Create Date : 2022:06:06 03:18:28+09:00
Focal Length : 12.0 mm
Light Value : 5.3
コマンドは他のコマンドと組み合わせて使うことができます. コマンドの出力はパイプと呼ばれる記号 |
で後ろのコマンドに渡されます. ここでは, grep
は必要な行を検索して抜き出してくる役割, awk
は必要なデータを抜き出してくる役割を持っています.
exiftool --DateTimeOriginal photo1.jpeg | grep "Date/Time Original" | awk '{print $4, $5}'
画像の上に文字を載せるためには convert
というコマンドを使います. 諸々書いて,
convert photo1.jpeg -fill yellow -pointsize 180 -undercolor '#00000080' -annotate +100+300 "`exiftool --DateTimeOriginal photo1.jpeg | grep "Date/Time Original" | awk '{print $4, $5}'`" new_photo1.jpeg
無事1行実行するだけで正確な日時を入れることができました. そして, この作業は何度やっても全く同じ結果になります. つまり, マウスの位置がちょっとずれてしまったり、日時を写し間違えるなどということはありません. さらに, 写真が何百枚あっても, このコマンドのファイル名の部分を変えて実行するだけで, 各写真について同じ処理をすることができます. (もちろん, ファイル名を変えるのも普通は自動化しますが, 本稿では取り扱いません. 普通は長い1行のコマンドにするよりも, シェルスクリプトとして書くことが多いと思います.) 愚直な処理はコンピューターが得意とするところです. CUIでは, 人間が介在するGUIより少し, コンピューター側に寄り添ったインターフェースということができると思います.
ディレクトリ構造
Windows や MacOS を使っていると, ファイラーにたくさんのファイルが保存されているのをご覧になられていると思います. それらのファイルは大抵フォルダによってまとめられているはずです. Unix系のOSでも似た仕組みでファイルを管理しています. ただし, 解析の文脈では, フォルダのことは通常ディレクトリ (directory) と呼びます. フォルダというよりディレクトリと言った方がかっこいいのでそうしておきましょう (本当は些末な差異があります).
Unix系のOSでは, 全てのディレクトリ, ファイルが1つの大きなディレクトリに収められており, 多重にディレクトリの入れ子になっているような構造をしています.
ディレクトリの区切りは /
(スラッシュ) で表します. 今現在自分がいるディレクトリ (カレントディレクトリ) は .
, 自分のいるディレクトリを含んでいるディレクトリ (親ディレクトリ) は ..
で表現します.
上の図で mzks
ディレクトリにいるとします.
xenon
のディレクトリの中にある, analysis
ディレクトリの中にある, make_data.C
というファイルは, xenon/analysis/make_data.C
と表すことができます. これは, 相対パスと呼ばれるファイルの指定の仕方です.
大本の親ディレクトリもまた, /
記号で表します. 同じファイルを, /home/mzks/xenon/analysis/make_data.C
と指定することができます. これは, 現在自分がどのディレクトリにいるかということとは関係なくファイルを指定する方法で, 絶対パスと呼ばれます.
基礎的なコマンド
色々とコマンドを知っていれば, できることが広がりますが, 解析をするためにはそんなにたくさんのコマンドを知っている必要はありません. 前項で例示した exiftool
などを解析で使うことは全くないと思います. ここでは, 知っておいた方がいいコマンドをいくつか示します.
cd, pwd, ls - ファイルシステム関係のコマンド
前項で当然のように自分のいるディレクトリという概念を登場させました. cd
は今いるディレクトリを変更するコマンドです. (change directory). 単に cd
と打てば, 自分のホームディレクトリに移動するはずです. 自分が今どのディレクトリにいるかは, pwd
コマンドで確認できます. そのディレクトリにどのようなディレクトリ, ファイルがあるかは ls
コマンドで確認できます.
man - マニュアルを出すコマンド
コマンドの使い方がわからない時, マニュアルを見ることができます.
man ls
と打つと, ls
コマンドのマニュアルを確認することができます.
NAME
ls – list directory contents
SYNOPSIS
ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when]
[-D format] [file ...]
DESCRIPTION
For each operand that names a file of a type other than directory, ls
displays its name as well as any requested, associated information. For
each operand that names a file of type directory, ls displays the names
of files contained within that directory, as well as any requested,
associated information.
list directory contents の名前の通り, ls
はディレクトリの中身を列挙するコマンドです. その後の, SYNOPSISというところに使い方が書いてあります. [] で括られているのはオプションと呼ばれるもので, つけるとコマンドの挙動を変えるものです.
man で開いたページはhjkl で移動できるので, したまでいくと, 以下のように各オプションを説明しているパートがあります.
The following options are available:
-@ Display extended attribute keys and sizes in long (-l) output.
-A Include directory entries whose names begin with a dot (‘.’)
except for . and ... Automatically set for the super-user
unless -I is specified.
-B Force printing of non-printable characters (as defined by
ctype(3) and current locale settings) in file names as \xxx,
where xxx is the numeric value of the character in octal. This
option is not defined in IEEE Std 1003.1-2008 (“POSIX.1”).
-C Force multi-column output; this is the default when output is to
a terminal.
オプションは多くの場合, コマンドに ls -a
などと指定します. 複数のオプションを指定する際は, ls -la
と続けて書けることが多いです. 今回の場合はディレクトリに含まれるものを表示することに加えて, 詳細情報を表示させ, 隠しファイルも表示させるというオプションです.
man で開いたページは q
キーを押すと閉じることができます.
mkdir - ディレクトリを作るコマンド
ディレクトリを作るコマンドです. mkdir new_dir
でnew_dirという名前のディレクトリができます.
mv - 名前を変更する/移動する
ファイル, ディレクトリを移動するコマンドです. 名前を変えるときもこのコマンドを使います.
mv <元ファイルのパス> <新ファイルのパス>
という使い方です.
rm - 削除するコマンド
ファイル, ディレクトリを削除するコマンドです.
ディレクトリを削除したいときは r
オプションをつけて, rm -r <削除するディレクトリ>
としてください.
本当に消しますか? みたいなことを聞かれると思います. 聞き返されないようにするためには -f
オプションをつけて, rm -rf
とすれば良いですが, 大事なものを手癖で消さないように注意してください.
タブキー習慣
皆さんはTabキーを使っていらっしゃるでしょうか? キーボードの”Q” キーの左, CapsLock キーの上にあるはずです. (余談ですが, CapsLockはControlにマップしておくのがおすすめです.)
Tabキーには補完機能が割り当てられており, コマンドを打つ際には非常に便利に使うことができます.
コマンドを途中まで打っている時に, Tabキーを押してください. 例えば, mkdir
を打とうとして, 途中の mkd
まで打ったところでおもむろにTabキーを押します.
mkd<ここでTabキーを押す>
すると, mkdir
と残りの文字が補完されて一瞬で入力が完了していると思います.
また, mk
くらいまでだと, まだいくつか候補があるかもしれません. 私の環境では以下のように mk
で始まるコマンドの色々な候補が表示されました.
> mkbom
mkbom mkextunpack mkfile mkfontscale mknod mktemp
mkdir mkfifo mkfontdir mklocale mkpassdb
さらにTabキーを押していくと, これらの候補を一つずつ遷移します. 我々が行うことは, 欲しいコマンドが表示された時にEnterキーを押すだけです.
候補がない時, 大抵は打ちたいコマンドが間違っている時, なんの候補も表示されず, 補完もされません. つまり, 日常的にTabキーを押して, コマンドを最後まで打たないようにすると, 長いコマンドでも間違えずに打つことができます.
加えて, Tabキーはコマンドのみならずファイルパスの入力にも使えます. ファイル名, ディレクトリ名もTabキーを使うことで間違えずに入力することができます.
Tabキーを押すことで, 以前の入力を変えてしまうことはありません. 弊害はありませんので, 安心してTabキーを押していく習慣をつけると, 仕事が楽になると思います.