2016.11.03

Macを使い始めたらとりあえずは覚えたい12のUNIXコマンド

環境

  • Mac OS X El Capitan
  • zsh (Mac付属のターミナルならばなんでも良いです)

この投稿のゴール

  • 基本的な UNIX コマンドを叩けるようになるよ

ターミナルが叩けるようになると..

  • モテる

Mac OSX Yosemite でターミナルを起動してみる

アプリケーションフォルダの「ユーティリティ」内にターミナルはいるよ

2015-06-12-12-45-50

構文

基本的には「コマンド」「オプション」「引数」を「半角スペース」で区切った組み合わせで構成されるよ。組み合わせの例として

  • コマンドのみ
  • コマンド + オプション
  • コマンド + 引数
  • コマンド + オプション + 引数

が挙げられるよ。実際にはパイプという機能を使い、あるコマンドの出力結果を他のコマンドの入力として利用したりして、上記の組み合わせだけにとどまらないこともあるけれど基本は上記のパターンを基本としておさえておこう。

また、4つ目の組み合わせ「コマンド + オプション + 引数」に於いて「オプション」と「引数」は必ず「オプションが先」になることも覚えておこうね。

実行は、入力後に Enter キーを操作することで実行が始まるよ

画面の説明

ウィンドウの見た目はもうちょっと地味目かもしれないけど、デフォルトの設定では以下の様な文字が出てくるよ

terminal2

各文字列や、記号は以下のとおり

  • Chrowa3 は ユーザー名
  • WEBYAIN は マシン名
  • ~ は 作業ディレクトリ(※)
  • $ はプロンプトといって、システムが入力を待機している状態を示す記号

※ 作業ディレクトリとは、現在参照している場所を示していて、例えばデスクトップならばこの部分は「Desktop」となるよ。~(チルダ)に関しては次項で説明

絶対パスと相対パス(と~について)

作業ディレクトリを示す部分では、~(チルダ)や、/(スラッシュ)の「記号」で示す場所や、単純に Desktop などの「文字列」で示す場合があるよ。

/(スラッシュ)で表すのは「ルートディレクトリ」で UNIX 系 OS では最上位のディレクトリを示し、Windows でいう C:¥ みたいなイメージ

この /(スラッシュ)から指定したパスは「絶対パス」と呼ばれ、最上位からのファイルやディレクトリの指定になるよ。下図でいう root から辿ってくイメージ

directory

これに対し、相対パスは .(ピリオド)や ..(ピリオド x2)で表し、「.」はカレントディレクトリ(作業ディレクトリ:現在のディレクトリ)を示し、「..」では、一つ上の階層(ペアレントディレクトリ)を示すよ。

上図でいうと、たとえば Chrowa3 にいる状態で「.」は Chrowa3 を示し、「..」は Users を示すことになるんだ。

ちなみにさっきからちょいちょい出てくる ~(チルダ)は、ホームディレクトリを示すよ。ターミナルを立ち上げた直後は Chrowa3 がカレントディレクトリとなり、他の場所にいる場合でも ~(チルダ)に移動すれば Chrowa3 に移動することができるんだ

pwd (print working directory)

作業(カレント)ディレクトリを出力

pwdは「現在の作業ディレクトリ」をルートディレクトリからのパスの形で出力します

cd (change directory)

作業(カレント)ディレクトリの変更

pwdコマンドをいろいろな場所で試す為にも、ディレクトリの移動が出来るようになりたいところだよね。ディレクトリの移動には cd コマンドを使うよ

引数には「ルートディレクトリからの位置を指し示す絶対パス」や「現在の作業ディレクトリからの位置を指し示す相対パス」で指定するよ

tab補完

bashでは補完対象が一つに絞り込める場合は、コマンドやパスの入力途中でtabキーを押すと入力補完が行われるよ。もし一つに絞り込めない場合は、もう一度tabキーを押すと入力した文字の時点での入力候補がリスト表示されるよ。

ls (list segments)

ファイルの一覧を出力

これまでのコマンドで、現在の作業ディレクトリを確認することや作業ディレクトリの変更をおこなえるようになったね。

しかし何かしらの操作をしたいディレクトリに「何が存在するのか、作業ディレクトリをどこに変更するのか」がわからないと操作のしようがないよね。そこで ls コマンドを用いてファイルの一覧を出力し、作業する対象のファイルやディレクトリを見つけるよ

ls コマンドにはファイル名やディレクトリ名などの一覧を表示するだけではなく、様々なオプションをつける事によって表示内容を変えることが出来ます。ここではよく使うようなオプションを纏めてみた

オプション 説明
-a 隠しファイルを含めたファイル全て表示
-l ファイルの詳細も表示
-F ファイルタイプを表す記号をつけて表示
※ディレクトリにはファイル名の最後に/(スラッシュ)がつく
-R サブディレクトリの中身も表示

※ オプションは ls -al の様に複数指定することもできます

chmod (change mode)

ファイルモードを変更

chmod ではパーミッションの設定 を変更することができるよ。パーミッションとは「ファイルやディレクトリに対してのユーザやグループが持つ権限」のことでこの設定によって行える操作が変わってくるんだ。

このパーミッションの設定を行うためにもパーミッションについて基礎的な知識が必要となるので軽めに説明するよ。

まずは、パーミッションの確認なんだけど、ls コマンドで l オプションを指定し、ファイル・ディレクトリの詳細な一覧を表示。

この ls -l で表示される内容は以下のとおり(左から)

  • ファイルの種類とパーミッション
  • ディレクトリ数もしくはハードリンク数
  • 所有者とグループ
  • 容量
  • 更新時刻
  • ファイル名(シンボリックリンクの場合はリンク先)

パーミッションは一番左側の「-rw-r–r–」や「drwxr-xr-x」です。最初の一文字目は「ファイルの種類」を示しているよ。「-」はファイルを、「d」はディレクトリを、「l」(エル)はシンボリックリンクを示しているよ。

2文字目から10文字目の9文字はパーミッションを示しているよ。パーミッションは9文字で表し、3文字ずつで1セット、このセットが3セットあるとして考えるんだ。

chmod

この3文字1セットの組み合わせは、左側から「User(所有者)」「Group(グループ)」「Other(その他のユーザー)」といったように各ユーザーに対しアクセスの制限を設定することができるんだ。

上図 a の通り、この3文字のセットはそれぞれ「r(readable)」「w(writable)」「x(executable)」「-(not permitting)」の意味を持つよ。また、パーミッションは文字以外でも数字で表すこともできるよ。上図 f はその数字の持つ意味を表しているよ。

実際に chmod にてパーミッションを変更する場合、引数に上記の記号や数値を渡すよ。たとえば文字で設定する例として =(イコール)を使って設定することもできます。下記例では、所有者(u)に対し、r(readable)、w(writable)、x(executable)の3つを与えます。それ以外は何も記述しないことによる「不許可」を設定しているよ。

次は、+(プラス)記号を使った設定例。+r とすると全てのユーザーに、r(readable)を与えるよ

慣れるまで大変だけどすぐ慣れるよ!数値での設定も慣れちゃえばすごく便利。

数字での設定は、r(readable)を 4 、w(writable)を 2 、x(executable)を 1 、-(not permittingnot permitting)を 0 といった意味を持つよ。これらを足した数値を使い3桁で表すんだ。例えば、User(所有者)に、r と w を与え、それ以外を不許可にする場合は、4+2で6。それ以外は 0 なので 600 になるよ。以下、例を幾つか紹介するよ。

全部不許可

全部許可

全てのユーザーに読み込みと実行権限を与え、所有者のみに書き込み権限も与える

全てのユーザーに読み込み権限を与え、所有者に書き込み権限も与える

例えばディレクトリに全部不許可にしてみた場合に cd で移動しようとすると下部サンプルの様に「Permission denied」と表示されアクセスできません。

各種オプション

オプション 説明
-f パーミッションの変更できないファイルを指定してもエラーが発生しないようにする。変更自体は行われない
-R 対象をディレクトリにした時に、その中に含まれるファイルやディレクトリ全てもパーミッションを変更させる

mkdir (make directory)

ディレクトリを作成する

mkdir でディレクトリを作成できるよ。作成時には「パーミッションの設定」や「サブディレクトリを含むディレクトリの作成」も同時に行えるオプションを設定することもできるよ。

-p オプションでは「サブディレクトリを含むディレクトリの作成」をするよ。

-m オプションではディレクトリの作成と同時にパーミッションを設定を行うよ。

rm (remove)

ファイルやディレクトリを削除する

オプションを指定しなければ基本的にはファイルの削除コマンドです。オプションを指定すればディレクトリも削除することができるよ。

rmdir というディレクトリを削除するコマンドありますが、空のディレクトリしか削除できないのに対し、rm は ディレクトリが空でなくても削除することができるので便利なんだ。

ワイルドカードついて

次項で説明する find コマンドなどで利用するワイルドカードやメタキャラクタについて触れておくよ。通常、find コマンドに於いては扱えるワイルドカードは以下のとおり。

find で扱えるメタキャラクタ

メタキャラクタ 説明
? 任意の一文字
* 任意の文字列
[…] ブラケット内の任意の一文字
[^…] ブラケット内の文字以外の一文字
{…,…} カンマで区切られた文字列のうちのどれか

grep や sed で扱えるメタキャラクタ

メタキャラクタ 説明
. 任意の一文字
* 直前の文字0回以上の繰り返し
^ 行頭
$ 行末
[…] ブラケット内の任意の一文字
[^…] ブラケット内の文字以外の一文字
+ 直前の文字1回以上の繰り返し
? 直前の文字 0個 or 1個
{n} 直前の文字 n個の繰り返し
{n,} 直前の文字 n個以上の繰り返し
{,m} 直前の文字 m個以下の繰り返し
{n,m} 直前の文字 n個以上、m個以下の繰り返し
patternA|patternB  patternA もしくは patternB に一致
 (pattern)  パターンのグルーピング。キャプチャも可能

find

ファイルやディレクトリを検索する

find コマンドでは、条件に応じたファイルやディレクトリを検索することができるよ。条件は複合的に指定することもでき、以下のような条件を指定することができるよ(抜粋)

  • 日付
  • ファイル名
  • アクセス権
  • ファイルサイズ
  • ファイルタイプ
  • ユーザー名、グループ名

このポストではよく使うであろう、ワイルドカードを使ったファイルの検索と、更新日を指定した検索をご紹介

更新日で探す例

更新日で探すには -mtime オプションを指定するよ。日付で探すオプションは他にも -atime(最後にアクセスされた時刻)、-ctime(ファイルのステータスが最後に変更された時刻)があるよ。

これらの日付で探す際にはオプションの後に「日数」を指定します。FreeBSD では時刻や分、秒まで指定できるのでかなり詳細な指定が可能。

日付の指定には以下の様な方法があるよ。「この一週間で操作したファイルなんだよな~」ですと -7 を指定し、「一週間以上は経ってんだよなー」ですと +7 を指定するイメージ。

指定 説明
n 数日前のその日
+n 数日前以上前
-n 数日前以降

ではサンプル。以下のディレクトリででは、touch コマンドでタイムスタンプを一日ずつずらしたテキストファイルを用意してみた。

ワイルドカードを使ってファイルを探す例

find コマンドで一番良く使うのが「ワイルドカード」を使ったファイル検索だと思います。ファイル名に .txt が含まれるファイルを探し出し、検索されたファイルに対して ls コマンドを実行する例をご紹介。

メタキャラクタを利用するときの注意点として、文字列をダブルクォーテーション(”)で囲う必要があるということを忘れないでね。

この処理の結果として hoge ディレクトリ内の .txt も探してきてくれています。検索結果に対し指定したコマンドを実行するには -exec オプションを使うよ。

この例では ls コマンドを使っていますが、最後に {} \ ; と謎の記号があります。{} は 検索でヒットしたファイル名に置き換えられるだけだよ。-exec オプションは ;(セミコロン)を終端としますが、; はキチンとエスケープしないと bash に思わぬ解釈をされてしまうので気をつけてね。

※余談ですが、ls だったら -exce を使わなくとも -ls と指定することも出来るよ

各種オプション(抜粋)

オプション 説明
-atime 最後にアクセスされた時間と比較
-ctime 最後にステータスが変更された時間と比較
-mtime 最後に更新された時間と比較
-name ファイル名を指定して検索
-type ファイルタイプを指定して検索
-size ファイルサイズを比較して検索
-user ファイルの所有者を指定して検索
-group ファイルのグループを指定して検索
-exec 検索結果ほ他のコマンドに引き渡す
-newer 基準となるタイムスタンプを持つファイルと更新日時を比較して検索
-print 条件にマッチしたファイルの名前を表示する
-perm アクセス権(8進数)で比較して検索

grep

テキストファイルの中から正規表現に一致する行を検索して出力

grep ではファイル内の文字列をあいまい検索してくれるコマンドだよ。探したい文字列を正規表現で指定しその一覧を出力してくれる超便利ツール

次のサンプルの正規表現としては「^Siz{2}le」で次の文字列にマッチします。

  1. 先頭文字が S
  2. 次に i
  3. 次に z
  4. z が 2回繰り返される、いわゆる「zz」にマッチ
  5. 次に l
  6. 次に e

結果は以下のとおり

各種オプション(抜粋)

オプション 説明
-i 大文字・小文字の区別をしない
-n 行番号も出力
-r 検索対象をファイルではなく、ディレクトリにした場合に指定したディレクトリ配下全てのテキストファイルを捜査する

cp(copy)

ファイルやディレクトリの複製をつくる

source がコピー元、targetがコピー先です。よく使うオプションは以下のとおり

各種オプション(抜粋)

オプション 説明
-f コピー先に既に同名のファイルがあったとしても、ユーザへの確認無しにコピーが行われる(厳密にはコピー先のファイルの削除を試みる)
-i コピー先に同名のファイルがあった場合に、ユーザへの確認を行う
-r ディレクトリを再帰的にまるごとまるっと複製したいときはこのオプション

サンプルです

mv(move file)

ファイルやディレクトリを移動(同一ディレクトリに別名で移動すれば名称変更に)

source が移動する元ファイル(ディレクトリ)で、target 移動先での名前になるよ。移動先がディレクトリの場合は名前はそのままに移動するよ。

各種オプション(抜粋)

オプション 説明
-f 移動先に既に同名のファイルがあったとしても、ユーザへの確認無しに上書きが行われる
-i 移動先に同名のファイルがあった場合に、ユーザへの確認をおこなう

ファイル名変更の例

パスを指定してファイルを移動する例

history

シェルへの入力履歴を表示する

各種オプション(抜粋)

オプション 説明
-c 履歴をクリア
-r 逆順に表示

まとめ

他にも沢山の UNIX コマンドはありますが、さしあたり且つ簡単なやつばかりを纏めてみたよ。特に find コマンドは突き詰めていけばより凝った使い方もできるので各人で研究してみるといいかもね!これでチミもモテモテだ!