Linuxコマンド入門(1) ~ディレクトリ操作~

　Linuxコマンドの中でも，ディレクトリ操作コマンドは最も初歩的で最もよく使うコマンドではないでしょうか．ここでは，その中でも特に基本的なコマンドとディレクトリの基礎知識についてまとめています．
  
 　今回扱うコマンドは以下の通りです．
 
 * ディレクトリ操作コマンド
     * pwd
     * ls
     * cd
     * pushd
     * popd
     * mkdir
     * rmdir
 
　こちらのブログでも同じものを扱っています．よろしくお願いいたします．
### [エンリュの迷い森｜【第6回】Linuxコマンド入門(1)][a006]

# 環境

 * Cent OS 6.8

# カレントディレクトリの表示

　**ディレクトリ**というのは，コンピュータのファイルシステムの「場所」を表す概念で，ファイルを格納するものです．フォルダのようなものと考えてよいでしょう．ディレクトリは階層構造を作っており，これによってファイルの場所を一意に表現します．
 
## pwdコマンド

　今いる場所，すなわち現在のディレクトリのことを**カレントディレクトリ**といいます．pwdコマンドは，"**print working directory**"の意味で，カレントディレクトリを表示します．
 
```shell-session
$ pwd
```
　なお，$マークはコマンドラインの入力を意味します．ターミナルにはすでに$が表示されていると思います．`$ pwd`と書いてあるときはそこに「pwd」と入力してEnterを押してください．
　作業中に今いる場所が分からなくなったら，pwdコマンドで調べましょう．
 
![pwd_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/065d84c6-7c0c-a88d-33f9-edc48a91cf3e.png)

# ディレクトリ内の一覧表示

## ls コマンド(1)

　lsコマンドは"**list**"の略で，ディレクトリの中身を一覧表示します．lsには様々なコマンドオプションが用意されています．
 
```shell-session
 $ ls
 $ ls -a
 $ ls -l
 $ ls -al
```
 `ls -a`は普段は表示されないドットファイル，ドットディレクトリも表示します．
 
 `ls -l`はファイルの詳細情報を併せて表示します．
　二つのコマンドオプションを組み合わせることもできます． 

![ls_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/87cd759c-9608-b06d-3da6-023a9ab135e9.png)
![ls_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/830ecccd-93e0-0b9a-b5af-2b1eb21eca02.png)

### おまけ：ファイルの詳細情報

　`ls -l`で表示されるファイルの詳細情報の一部を切り取ってみましょう．

```shell-session
$ ls -l
-rw-r--r--.  1 enryu enryu  124 May 11 08:21 .bashrc
drwxr-xr-x.  2 enryu enryu 4096 Oct 16 02:00 Desktop
```

　これらの文字はなにを意味しているかというと，左から順に
 
  * パーミッション
  * リンク数
  * 所有者
  * 所有グループ
  * ファイルサイズ
  * 最終更新日時
  * ファイル名/ディレクトリ名

　となっています．
 
　**パーミッション**は10文字の文字からなります．最初のdはディレクトリかどうかを表します．残りの9文字は，誰にどの操作を許可するかという**アクセス権**を表します．「owner/group/other」の順で並んでおり，「r」が「読み込み権限/ディレクトリの一覧権限」，「w」が「書き込み権限/ディレクトリの作成権限」，「x」が「実行権限/ディレクトリの侵入権限」を表します．
 
　`ls -l`で表示される書式を「long listing format」といいます．
 
　パーミッションの設定方法などはまた今度やります．少々ややこしいかもしれませんが，ファイルの管理には欠かせない知識です．
 
## ls コマンド(2)

　ls コマンドは，引数にディレクトリ名を入力することで，任意のディレクトリの一覧を表示することができます．例えば次のような使い方があります．
 
```shell-session
$ ls -a Desktop
$ ls /
$ ls /usr/bin
```

![ls_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/1818de1f-4898-723c-c98a-0fbdc328e117.png)

### 色々なディレクトリ

　いくつかのディレクトリには記号で表されるものがあります．少しまとめてみましょう．

|記号|名前|説明|
|:----|:----:|:----|
|.|カレントディレクトリ|現在のディレクトリ|
|..|親ディレクトリ|ひとつ上の階層のディレクトリ|
|~|ホームディレクトリ|ログインしたときに最初にいるディレクトリ|
|/|ルートディレクトリ|一番上のディレクトリ|

　親ディレクトリとは反対に，一つ下のディレクトリを**サブディレクトリ**といいます．ルートディレクトリの下にあるすべてのディレクトリをサブディレクトリということもあります．
 
# ディレクトリの移動
##  cd コマンド

　cd コマンドは"**change directory**"の意味で，指定したディレクトリに移動します．ディレクトリの指定には，先ほどのディレクトリを表す記号を使うことができます．ただし，パーミッションの「x」がないディレクトリには入れないので注意しましょう．
 
　ファイルやディレクトリ名を入力するとき，途中まで入力して**Tabキーを押すと補完**してくれます．また，候補がたくさんあるときは候補を表示してくれます．lsコマンドやcdコマンドを使うときに試してみましょう．

```shell-session
$ cd ..
$ ls
$ cd ./enryu/Documents/
$ pwd
$ cd /
$ ls -g
$ cd /root
$ cd ~
$ pwd
```

![cd_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/244df7de-27ce-9c22-64df-79aba91c1ee1.png)

### 相対パスと絶対パス

　`../../Documents/foo`といったディレクトリの指定は，カレントディレクトリからの相対的な場所を辿っていきます．これを**相対パス**といいます．一方`/home/enryu/Desktop`のような指定方法はルートディレクトリから辿ります．カレントディレクトリに関わらず絶対位置を指定するので**絶対パス**といいます．

## pushd コマンドとpopdコマンド

　pushd, popd コマンドはそれぞれ"**push directory**", "**pop directory**"の意味です．push/popは**スタック**というメモリ方式に対する操作の用語ですが，詳しくはまた後日取り扱います．pushdはカレントディレクトリを記憶したまま指定したディレクトリに移動し，popdは最後に記憶したディレクトリから順番に戻ります．記憶したディレクトリはdirsコマンドで見られます．
 
```shell-session
$ pwd
$ pushd Documents/ # ~を記憶して~/Documentsに移動
$ pushd ../Downloads/ # Documentsを記憶してDownloadsに移動
$ pushd -n ../Desktop/ # nオプションで移動しないでDesktopを記憶
$ pushd +1 # カレントディレクトリを末尾に加えて1番のディレクトリに移動
$ pushd -0 # 末尾のディレクトリに移動してカレントディレクトリを先頭に
$ popd # 先頭のディレクトリに移動
$ popd +2 # 移動しないで2番目のディレクトリを記憶から削除
```

![pushd_popd_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/eda2d723-d74d-81ca-71b0-42d57099ef66.png)

# ディレクトリの作成・削除

## mkdir コマンド

　mkdir コマンドは"**make directory**"の意味で，ディレクトリを作成します．
　
```shell-session
$ mkdir sample            # sampleディレクトリを作成します
$ mkdir -v sample/subdir  # vオプションで詳細を表示します．
$ mkdir -v sample2/subdir   # 親ディレクトリが存在しないとエラーになります．
$ mkdir -vp sample2/subdir   # pオプションを付ければ親も一緒に作成します．
$ ls sample sample2    # まとめて二つのディレクトリの一覧を表示
```

![mkdir_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/2287e003-de88-eb1a-26ce-6a3869cca3e5.png)

## rmdirコマンド

　rmdir は"remove directory"の意味で，空のディレクトリを削除します．中身のあるディレクトリは削除できません．中身ごとディレクトリを消したい場合は，`rm -r *directory*`とします．
 
```shell-session
$ rmdir sample   # エラーになります
$ rmdir sample/subdir
$ rmdir sample
$ rm -r sample2    # 一度に消したいときはrmコマンドを使います
```

---- 以上

# こちらもよろしくお願いいたします．
### [エンリュの迷い森｜トップページ][blogtop]

[a006]: http://lost-in-forest.hatenablog.com/entry/a006
[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage