Linuxファイル管理とIOリダイレクト（三）

# 概要
+ ファイルの移動と名前の変更
+ ファイル名を変更
+ ファイルの削除
+ ディレクトリ操作

## 2.9 ファイルの移動と名前の変更
- `mv` コマンドはファイルやディレクトリの移動や名前変更を実行できます。
- 同じパーティション内でのデータの移動はとても速い：データの場所は変わりません
- 異なるパーティションへのデータの移動は比較的遅い：データの場所が変わります
### 書式と例：
```
書式：
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

# よく使われるオプション
-b # ターゲットが存在する場合は、最初にバックアップします
-n|--no-clobber # ターゲットファイルが既に存在する場合は、そのファイルの移動をスキップします
-i|--interactive # ターゲットファイルが既に存在する場合は、上書きするかどうかを尋ねます
-u|--update # ソースファイルがターゲットファイルより新しい場合にのみ、移動操作を実行します
-v|--verbose # 移動過程を表示します

例：
# 移動前にバックアップ
[root@rocky86 ~]# mv -b a a1
# 複数のファイルをディレクトリに移動
[root@rocky86 ~]# mv a b c d abcd/
# abcディレクトリをabcdディレクトリ内に入れます。abcdディレクトリが存在しない場合は、abcディレクトリの名前をabcdディレクトリに変更します
[root@rocky86 ~]# mv abc/ abcd
# abcディレクトリ内のすべての内容を現在のディレクトリに移動
[root@rocky86 ~]# mv abc/* .
```


## 2.10 `rename` コマンドを利用して、一括でファイル名を変更することができます。
### 書式と例：
```
書式：rename [options] <expression> <replacement> <file>...

# よく使われるオプション
-v|--verbose # 過程を表示
-s|--symlink # ターゲットがリンクファイルの場合、その指す先の名前を変更します
-n|--no-act # 実際には変更を加えません
-o|--no-overwrite # 既に存在するファイルを上書きしません

例：
# すべてのfで始まり、confを含むファイルに.bakサフィックスを追加します
[root@rocky86 ~]# rename 'conf' 'conf.bak' f*

# すべての.bakサフィックスを削除します
[root@rocky86 ~]# rename '.bak' '' *.bak

# 現在のディレクトリ内で.txtで終わるファイルを一括して.logに名前を変更します
[root@rocky86 ~]# rename -v txt log *.txt

# abc.linkが指しているファイルのabcをxyzに変更します
[root@rocky86 ~]# rename -s abc xyz abc.link
```
## 2.11 ファイルの削除
`rm` コマンドを使用してファイルやディレクトリを削除することができます。
注意：このコマンドは非常に危険です。慎重に使用し、可能であれば `mv` コマンドを `rm` コマンドの代わりに利用することをお勧めします。

```
書式：rm [OPTION]... [FILE]...

### よく使用されるオプション：
- `-i` # 削除前に確認
- `-f` または `--force` # 確認なしで直接削除
- `-r` または `-R` または `--recursive` # 再帰的に削除
- `-d` または `--dir` # 空のディレクトリを削除
- `--no-preserve-root` # ルートディレクトリを強制的に削除

例：
# 削除前に確認
rm -i filename.txt

# 確認せずに強制的に削除
rm -f filename.txt

# ディレクトリとその中身を再帰的に削除
rm -r foldername

# 空のディレクトリを削除
rm -d emptyfolder

# ルートディレクトリ（非推奨）を強制削除
rm --no-preserve-root / -rf
```

:::note alert
注意：実際にルートディレクトリを削除するコマンドの実行はシステムを破壊する可能性があるため、非常に危険です。絶対に必要がない限り、このオプションは使用しないでください。
:::

## 2.12 ディレクトリ操作
### 2.12.1 ディレクトリツリーを表示する `tree`
`tree` コマンドはディレクトリとそのサブディレクトリ、ファイルをツリー形式で表示します。
```
書式：tree [-acdfghilnpqrstuvxACDFJQNSUX] [-H baseHREF] [-T title]

### よく使用されるオプション：
- `-a` # 隠しディレクトリやファイルを含むすべてを表示
- `-d` # ディレクトリのみを表示
- `-f` # すべてのアイテムの完全なパスを表示
- `-F` # 実行可能ファイル、ディレクトリ、ソケット、シンボリックリンク、パイプファイルに対応するマーク("*", "/", "=", "@", "|")を付加
- `-g` # ファイルのグループを表示。グループ名が見つからない場合はGIDで表示
- `-u` # ファイル所有者を表示。ユーザー名が見つからない場合はUIDで表示
- `-p` # アイテムのパーミッションを表示
- `-s` # アイテムのサイズを表示
- `-i` # 階層構造を表示せず、平たく表示
- `-n` # 色を表示しない
- `-t` # 変更時刻でソートして表示
- `-r` # デフォルトのソート順（数字やアルファベット順）を逆にして表示
- `-o filename` # 表示結果を指定したファイルに出力
- `-L n` # n レベルのディレクトリのみ表示
- `-D` # アイテムの変更時刻を表示
- `-C` # 色付きで表示

例：
# 現在のディレクトリのツリーを表示
tree

# 特定のディレクトリのツリーを表示
tree dir1/

# ディレクトリのツリーを表示（2階層まで）
tree -d -L 2 /
```
:::note info
注意：すべてのオプションが全てのUNIXシステムで利用可能とは限りません。利用可能なオプションは具体的な`tree` のバージョンやインストールされているシステムにより異なる場合があります。コマンドを実行する前に `man tree` または `tree --help` で使用可能なオプションを確認してください。
:::


## 2.12.2 ディレクトリの作成 `mkdir`

`mkdir` コマンドは、1つまたは複数のディレクトリを作成するために使用されます。


```
書式：mkdir [OPTION]... DIRECTORY...
### よく使用されるオプション：
- `-m` または `--mode` # ディレクトリのアクセス権限を設定
- `-p` または `--parents` # 必要な場合は親ディレクトリを逐次作成
- `-v` または `--verbose` # ディレクトリが作成されたプロセスを表示

例：
# 単一のディレクトリを作成
mkdir dira

# アクセス権限を指定してディレクトリを作成
mkdir -m=777 dirb

# 階層ディレクトリを逐次作成し、プロセスを表示
mkdir -pv dirx/diry/dirz
```
出力：
```
mkdir: created directory 'dirx'
mkdir: created directory 'dirx/diry'
mkdir: created directory 'dirx/diry/dirz'
```
そして、`tree` コマンドで作成したディレクトリ構造を表示：
```bash
tree dirx
```
出力：
```
dirx
└── diry
    └── dirz
2 directories, 0 files
```

## 2.11.3 空のディレクトリの削除 `rmdir`

`rmdir` コマンドは、空のディレクトリを削除するために使用されます。非空のディレクトリを削除する場合は、`rm -r` コマンドを使用してディレクトリツリーを再帰的に削除する必要があります。

```
書式：rmdir [OPTION]... DIRECTORY...
```

### よく使用されるオプション：
- `--ignore-fail-on-non-empty` # 非空のディレクトリがある場合のエラーメッセージを無視
- `-p` または `--parents` # 子ディレクトリとともに親ディレクトリも削除
- `-v` または `--verbose` # 削除プロセスを表示

例：ディレクトリツリーを作成し、その逆の順番で削除
```bash
# 階層ディレクトリを逐次作成し、プロセスを表示
mkdir -pv a/b/c/d

# 空のディレクトリツリーを削除し、プロセスを表示
rmdir -pv a/b/c/d
```
出力：
```
rmdir: removing directory, 'a/b/c/d'
rmdir: removing directory, 'a/b/c'
rmdir: removing directory, 'a/b'
rmdir: removing directory, 'a'
```

:::note info
注意：`rmdir` で非空のディレクトリを削除することはできません。その場合、`rm -r` コマンドを使用する必要があります。
:::