Linux ディレクトリ・ファイル操作 コマンド一覧

# パスの概要について

パスは、ディレクトリやファイルの住所情報みたいなもので、ディレクトリの階層の区切りを「`/`」で表現しています。

- **絶対パス**
  - ルートディレクトリ 「`/`」 から始まるパス
  - 「`..`」は**親ディレクトリ**を表す。
- **相対パス**
  - カレントディレクトリから始まるパス
  - 「`.`」は**カレントディレクトリ**を表す。

[![Image from Gyazo](https://i.gyazo.com/faf47b86c8a405f28c43ba713e9fb94e.png)](https://gyazo.com/faf47b86c8a405f28c43ba713e9fb94e)


# `cd`コマンド
**ディレクトリの移動**　語源 : `change directory`

```shell
# 構文
$ cd（オプション）（ディレクトリ名）
```
### ディレクトリの指定

| ディレクトリ | 意味 | 指定方法 |
|:-:|:-:|:-:|
| カレントディレクトリ  | 現在自分がいるディレクトリ  |  「 . 」 |
|  親ディレクトリ | １つ上の階層のディレクトリ  |  「 .. 」 |
| ホームディレクトリ  | 「 /home/ユーザー名 」 ディレクトリ |  「 ~ 」、cd |
| ルートディレクトリ  |  「 / 」ディレクトリ |  「 / 」 |

# `pwd`コマンド
**カレントディレクトリの表示**　語源 : `print name of working directory`

```shell
# 構文
pwd（オプション）

# カレントディレクトリが taddy の場合
$ pwd
# 出力結果
$ /home/taddy 
```

# `ls`コマンド
**ファイルやディレクトリの一覧表示**　語源 : `list`

```shell
# 構文
$ ls（オプション）（ディレクトリ・ファイル名）

# ルートディレクトリの一覧を表示する場合
$ ls /

# 複数ディレクトリの一覧を表示する場合
$ ls / /home
```

## `-l`オプション
**ファイルの詳細情報を表示**

```shell
# devディレクトリの一覧表示した場合
$ ls -l
# 出力結果
drwxr-xr-x 2 taddy taddy 6 8月 6 11:57 dev
# d = ファイルタイプ / rwxr-xr-x = ファイルモード / 2 = リンク数 / taddy = 所有者 / taddy = 所有グループ
# 6 = サイズ / 8月 6 11:57 = タイムスタンプ / dev = ファイル名・ディレクトリ名
```

## `-a`オプション
**隠しファイルも含めた全ファイルの表示(`.`で始まるファイルを隠しファイルと言い、通常は表示されません)**

```shell
$ ls -a
# 出力結果
. .bash_history .bashrc desktop
```

## `-F`オプション
**ファイル種別を表示するオプション**

```shell
$ ls -F
# 出力結果
bin@ dev/ home/ lib64@
# 「　/ 」 = ディレクトリ 「 @ 」 = シンボリックリンク 「 * 」 = 実行可能ファイル 記号なし = 通常ファイル
```

:::note
ディレクトリ名の指定がない場合、カレントディレクトリの一覧を表示します。
:::

## パス名展開
**複数のファイルを一度に指定することができます。**

| 記号 | 意味 |
|:-:|:-:|
|*| 任意の文字列  |
|  ?  | 任意の１文字  |

```shell
# 拡張子が html のファイルの一覧表示する場合
$ ls *.html

# z　から始まり４文字で終わるファイルの表示する場合
$ ls /bin/z???
# 出力結果
  /bin/zcat /bin/zcmp /bin/znew
```

# `mkdir`コマンド
**ディレクトリの作成**　語源 : `make directory`

```shell
# 構文
$ mkdir（オプション）（作成するディレクトリ名）

# codeディレクトリを作成する場合
$ mkdir code

# 複数のディレクトリを一度に作成する場合
$ mkdir -p test/2021/11
# -p オプションを付与することで、3つのディレクトリ「test, 2021, 11」を作成
```

**ディレクトリの作成と同時に、作成したディレクトリへ移動**
`$_`・・・直前のコマンド引数を取得

```shell
# ホームディレクトリで作成した場合
~ $ mkdir code && cd $_

# 出力結果
code $
```

**複数のディレクトリを作成する場合（ファイルも可）**

```shell
$ mkdir {ディレクトリ名1,ディレクトリ名2}
```

:::note alert
カンマの後にスペースを入れるとエラーになるので注意!
:::

# `touch`コマンド
**空のファイルを作成**　語源：`touch`

```shell
# 構文
$ touch（ファイル名）

# 複数のファイル作成する場合
$ touch foo.html bar.html
```

# `rm`コマンド
**ファイル・ディレクトリの削除**　語源：`remove`

```shell
# 構文
$ rm（オプション）（削除するファイル名）

# foo.html と bar.htmlファイルを削除する場合
$ rm foo.html bar.html

# ファイルが格納されているディレクトリを削除する場合
$ rm -rf <ディレクトリ名>
```

:::note alert
実行すると、ゴミ箱に行くことなく本当に削除されるので使用する際は注意！
:::

## `-r`オプション
**ディレクトリも合わせて削除**　語源 : `reclusion`

```shell
$ rm -r（ディレクトリ名）
```

## `-f`オプション
**ファイル削除時に警告文を表示させない**

```shell
$ rm -f（ファイル名）
```

## `-i`オプション
**ファイルの削除前にファイル内を確認できる**

```shell
$ rm -i（ファイル名）
```

# `mv`コマンド
**ファイルの移動・ファイル名の変更**　語源 ： `move`

```shell
# 構文
$ mv（オプション）（移動元）（移動先） 

# ファイル名を file から file1 に変更する場合
$ mv file file1

# file1 を code ディレクトリ直下に移動する場合
$ mv file1 code/ 
```

# `rmdir`コマンド
**空ディレクトリの削除**　語源 : `remove directory`

:::note alert
空でないディレクトリを削除するとエラーになるので注意！
:::

```shell
# 構文
$ rmdir（ディレクトリ名）

# code ディレクトリを削除する場合
$ rmdir code
```

# `man`コマンド
**コマンドのマニュアルを表示**　語源 : `manual`

:::note
help オプションよりも詳しく調べたい時に使用します。
:::

```shell
# 構文
$ man（調べたいコマンド名）

# lsコマンドのマニュアルを表示する場合
$ man ls
```

## `-k`オプション
**キーワードから検索することができる**

```shell
# 「キーワード」がコマンドに含まれている一覧を表示する場合
$ man -k キーワード
```

# `cat`コマンド
**ファイルの中身を表示**　語源 ： `concatenate`

```shell
# 構文
$ cat（オプション）（ファイル名）

# etc ディレクトリ直下の hosts ファイルを表示する場合
$ cat /etc/hosts

# 複数ファイルをまとめて表示する場合
$ cat /etc/hostname /etc/hosts
# 出力結果
local.localdomain        # /etc/hostname の内容
127.0.0.1 localhost ...  # /etc/hosts の内容
::1       localhost6 ... # /etc/hosts の内容
```

## `-n`オプション
**行番号の表示**

```shell
$ cat -n /etc/hosts
# 出力結果
1 127.0.0.1 localhost ...
2 ::1       localhost6 ...
```

# `cp`コマンド
**ファイル・ディレクトリのコピー**　語源 ： `copy`

```shell
# ファイルのコピー
$ cp（コピー元）（新規ファイル名）

# ファイルをディレクトリ内にコピー
$ cp（コピー元ファイル名）（コピー先ディレクトリ名）
```

:::note alert
コピー先のファイルが既に存在すると上書きするので注意！
:::

### 【 cpコマンドでよく使うオプション 】

```shell
# 上書きする前に確認する(コピー元のディレクトリにファイルが存在する場合、ファイルも合わせてコピーされる)
$ cp -i <コピー元ファイル名> <コピー先ファイル名>

#  ディレクトリのコピー(-rオプションを付けないとディレクトリをコピーすることができない)
$ cp -r <コピー元ディレクトリ名> <新規ディレクトリ名>

# 更新日付(ステータス)を保ったまま、ファイルをコピー
$ cp -p <コピー元ファイル名> <コピー先ファイル名>
```

## `ln`コマンド
**リンクを張るコマンド** 語源 ： `link`

- **リンクを張るとは**
  - ファイルに別名を付けることを「リンクを張る」という

- **ハードリンク**
  - 1つのファイルの実体に複数の名前を付ける機能
  - 元のファイルを削除しても消えない
  - 全てのハードリンクがなくなった時に削除される

- **シンボリックリンク**
 - リンク先のパス名が書かれた特殊ファイルでリンク先がファイルの実体
 - ファイルの実体を削除、または移動するとファイルを参照できなくなる

- **リンクの使い方**
  - 長いパスを省略したいとき
  - 複数バージョンを共存させて最新を区別したいとき

```shell
# ハードリンクを張る
$ ln <リンク元ファイル名> <リンク名>

# 　シンボリックリンクを張る
$ ln -s <リンク元ファイル名> <リンク名>
```

## `find`コマンド
**ファイルの検索** 語源 ： `find`

```shell
# 構文
$ find <検索開始ディレクトリ> <検索条件> <アクション>

$ find . -name README.md -print # -print は省略可
# 出力結果
 ./wordpress/ ... /README.md

# ワイルドカードの使用（使用する場合は、「 ` 」もしくは「 " 」 で囲うこと）
$ find . -name '*.html' -print
```

### 【 findコマンドでよく使うオプション 】

## `-name`
**ファイル名を指定してファイルを検索（ファイル名の大文字小文字を区別）**

```shell
$ find . -name README.md
```

## `-iname`
**ファイル名を指定してファイルを検索（ファイル名の大文字小文字を区別しない）**

```shell
$ find . -iname readme.md
```

## `-type`
**ファイル名の種類で検索**

```shell
# -type f は通常検索
$ find . -type f -print

# -type l はシンボリックリンク
$ find . -type l -print

# -type d はディレクトリ
$ find . -type d -print
```

## `-a`
**複数の条件を指定（-a は省略可）**

```shell
# images　というディレクトリ名のパスを検索する場合
$ find . -type d -a -name images -print
```

# `less`コマンド
**ファイルの中身をスクロール表示するコマンド**　語源 ： `less - opposite of more`

```shell
# 構文
$ less（オプション）（ファイル名）
```

:::note
長いファイルの中身を確認したい時に使用します。
:::

| コマンド | 内容 | コマンド | 内容 |
|:-:|:-|:-:|:-|
| スペースキー, f  | 一画面下にスクロール  | /<文字列>  | 下方向に向かって検索  |
|  b |  一画面上にスクロール | ?<文字列>  | 上方向に向かって検索  |
| j  | 一行下にスクロール  | n  | 次の検索結果に移動  |
| k  | 一行上にスクロー  | N  | 前の検索結果に移動  |
| q  | lessコマンドを終了  |

##参考教材

https://www.udemy.com/course/unscared_linux/