Nextcloudの管理用CLI「occ」詳細： ファイル管理に関するコマンド群

# はじめに
NextcloudにはCLI環境として`occ`というものがあり、さまざまな設定、管理を行うことができます。 ここではoccで使える様々なコマンド群のうち、ファイル管理に関するコマンド群についてまとめてみます。

※occ の使い方については、 [Nextcloudの管理用CLI「occ」コマンドについて](https://qiita.com/S_Katz/items/99b9319127d956b22e7b)の記事を参照ください。

# 環境について
ここで記載するoccを実行するNextcloudのバージョンは、2019年3月17日現在で最新の`15.0.5`を利用します。  
WebサーバはNginxを利用した環境で実施しております。ApacheをWebサーバとして利用している場合は、`sudo -u` のユーザIDを`apache`に読み替えてください。

# ファイル管理に関するコマンド群
ファイル管理に関するコマンドは以下のようなものがあります。

- files:cleanup
- files:scan
- files:scan-app-data
- files:transfer-ownership

## files:scan
Nextcloudサーバに保管しているファイルをスキャンして、Nextcloudに未登録のファイルがあった場合にはNextcloud管理のファイルキャッシュとして取り込みを行います。Nextcloudのデータディレクトリのほか、SMB/CIFSなど連携設定されている外部ストレージもスキャン対象となります。

### 使い方
`files:scan [オプション] <ユーザID> ...`

#### オプション
- `--all`
Nextcloudで認識されているユーザの全てのファイルを再スキャンします。
- `-p, --path=PATH`
指定したファイルパスのみに限定して再スキャンします。対象ユーザIDは指定したパスに基づいて決まり、`--all`オプションは無視されます。
指定するパスは以下のように構成されていなければなりません。
※`files`ディレクトリは必須です。

```
"user_id/files/path"
  or
"user_id/files/mount_name"
  or
"user_id/files/mount_name/path"
```
- `--unscanned`
Nextcloudは通常はcronを使ってバックグラウンドジョブで定期的に未調査フォルダのファイルスキャンを実施します。このオプションを指定するとこのバックグラウンドジョブを手動起動することができます。
- `--shallow`
指定したディレクトリのみスキャン対象とし、配下のサブディレクトリを再帰的にスキャンしません。
- `--home-only`
Nextcloudのデータディレクトリに限定してスキャンします。外部ストレージはスキャンしません。
- `-v, -vv, -vvv, --verbose`
ファイルスキャン状況の詳細を出力します。どれを指定しても出力結果は同じになります。
- `--output=[OUTPUT]`
スキャン結果の出力フォーマットを指定します。指定できるフォーマットは次のとおりです。
  - `plain`: 普通の出力 (オプション未指定の場合のデフォルト)
  - `json`: JSON形式
  - `json_pretty`: 整形されたJSON形式

_# 現状ではどの出力フォーマットを指定しても出力がみんな同じようです。_


### 使用例
①全てのユーザの全ての利用可能なアプリのリストを出力する。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:scan --all
Starting scan for user 1 out of 5 (admin)
Starting scan for user 2 out of 5 (hanako.suzuki)
Starting scan for user 3 out of 5 (ichiro.satoh)
Starting scan for user 4 out of 5 (jiro.tanaka)
Starting scan for user 5 out of 5 (miki.morita)
+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 16      | 27    | 00:00:00     |
+---------+-------+--------------+
```
②`/ichiro.satoh/files/Photos`ディレクトリを再スキャンし、ファイルスキャン状況の詳細を出力する。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:scan --path=/ichiro.satoh/files/Photos -v
Starting scan for user 1 out of 1 (ichiro.satoh)
	Folder	/ichiro.satoh/files/Photos
	File	/ichiro.satoh/files/Photos/Coast.jpg
	File	/ichiro.satoh/files/Photos/Hummingbird.jpg
	File	/ichiro.satoh/files/Photos/Nut.jpg
	File	/ichiro.satoh/files/Photos/Nextcloud Community.jpg

+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 1       | 4     | 00:00:00     |
+---------+-------+--------------+
```
③`admin`、`ichiro.satoh`ユーザの保有ディレクトリを再スキャンする。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:scan admin ichiro.satoh
Starting scan for user 1 out of 2 (admin)
Starting scan for user 2 out of 2 (ichiro.satoh)
+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 16      | 27    | 00:00:00     |
+---------+-------+--------------+
```
④全体的に未調査フォルダをスキャンするバックグラウンドジョブを起動する。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:scan --all --unscanned
Starting scan for user 1 out of 5 (admin)
Starting scan for user 2 out of 5 (hanako.suzuki)
Starting scan for user 3 out of 5 (ichiro.satoh)
Starting scan for user 4 out of 5 (jiro.tanaka)
Starting scan for user 5 out of 5 (miki.morita)
+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 0       | 0     | 00:00:00     |
+---------+-------+--------------+
```

## files:cleanup
Nextcloudのストレージテーブルに一致しないファイルエントリを削除し、Nextcloudのファイルキャッシュを整理します。利用中のストレージ内のファイルとの整合をとるときには`files:scan`コマンドを利用します。

### 使い方
`files:cleanup`

### 使用例
①Nextcloudのファイルキャッシュを整理する。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:cleanup
0 orphaned file cache entries deleted
```

## files:transfer-ownership
あるユーザが所有しているファイル、共有設定を別のユーザに転送します。ユーザを削除する前にファイルを引き継ぐ際に役に立ちます。**転送元のファイルは全て削除され**、転送先のホームディレクトリに`transferred from <転送元ユーザID> on YYYY-MM-DD hh-mm-ss`のフォルダ名として転送されます。

### 使い方
`files:transfer-ownership [オプション] <転送元ユーザID> <転送先ユーザID>`

#### 転送元ユーザID
ファイル、共有設定の転送元となるユーザIDを指定します。

#### 転送先ユーザID
ファイル、共有設定の転送先となるユーザIDを指定します。

#### オプション
- `--path=PATH`
指定した転送元ディレクトリのみ転送します。パスは転送元ユーザのホームディレクトリを`/'として指定します。1つしか指定できないので複数ディレクトリを転送する場合はコマンドを繰り返して実行します。

### 使用例
①`ichiro,satoh`ユーザの全てのファイル、共有設定を`jiro.tanaka`ユーザに転送する

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:transfer-ownership ichiro.satoh jiro.tanaka
Analysing files of ichiro.satoh ...
   16 [============================]
Collecting all share information for files and folder of ichiro.satoh ...
    0 [>---------------------------]
Transferring files to jiro.tanaka/files/transferred from ichiro.satoh on 2019-03-16 03-36-56 ...
Restoring shares ...
    0 [>---------------------------]
```
②`admin`ユーザの`/Data`フォルダ以下の全てのファイル、共有設定を`ichiro.satoh`ユーザに転送する。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:transfer-ownership --path=/Data admin ichiro.satoh
Analysing files of admin ...
    4 [============================]
Collecting all share information for files and folder of admin ...
    0 [>---------------------------]
Transferring files to ichiro.satoh/files/transferred from admin on 2019-03-17 01-59-41 ...
Restoring shares ...
    0 [>---------------------------]
```

## files:scan-app-data
アプリで利用されているデータが保存されているディレクトリ(=`[データディレクトリ]/appdata_*`)を再スキャンしてアプリデータの更新を行います。

### 使い方
`files:scan-app-data [オプション]`

#### オプション
- `--output=[OUTPUT]`
スキャン結果の出力フォーマットを指定します。指定できるフォーマットは次のとおりです。
  - `plain`: 普通の出力 (オプション未指定の場合のデフォルト)
  - `json`: JSON形式
  - `json_pretty`: 整形されたJSON形式

_# 現状ではどの出力フォーマットを指定しても出力がみんな同じようです。_

### 使用例
①アプリデータを再スキャンしてアプリデータの更新を行う。

```
$ sudo -u nginx php /var/www/html/nextcloud/occ files:scan-app-data

Scanning AppData for files

+---------+-------+--------------+
| Folders | Files | Elapsed time |
+---------+-------+--------------+
| 58      | 178   | 00:00:00     |
+---------+-------+--------------+
```

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**