Re:GNU/Linuxにおけるゴミ箱ディレクトリは.Trash/$uid/と.Trash-$uid/のどちらが正しいのか

# きっかけ

@ncaq 氏が
[GNU/Linuxにおけるゴミ箱ディレクトリは.Trash/$uid/と.Trash-$uid/のどちらが正しいのか調べていたらtrash-cliのコメントが動作と違ったのでissueを開きました - ncaq](https://www.ncaq.net/2017/10/15/)
というブログを書いていて、
[trash-cli prefers $topdir/.Trash-$uid to the trash directory over $topdir/.Trash/$uid · Issue #108 · andreafrancia/trash-cli](https://github.com/andreafrancia/trash-cli/issues/108)
Issueも投げられていた。

しかし specを読むうちに、あれなんか違わね？と思った。

# ncaq 氏の記事の要約

`$topdir/.Trash/$uid`を使うべきなはずなのになんでnautilus(gio trash)もtrash-cliも`$topdir/.Trash-$uid`使っちゃうの？これっておかしくない？

# 参照するspec

Trash specification
https://specifications.freedesktop.org/trash-spec/trashspec-latest.html

# 場面設定

1. spec曰く、通常使うゴミ箱ディレクトリとして*home trash*ディレクトリがある。
2. 削除したいファイルが、*home trash*ディレクトリが存在しないドライブ/ファイルシステムにある場合、これを使おうとするとコピーコストがかかるのでマウントされているすべてのドライブ/ファイルシステムに(*home trash*ディレクトリが存在するドライブ/ファイルシステムを除く)ゴミ箱ディレクトリを作れる**(MAY)**
3. 作れる場所は`$topdir/.Trash/$uid`か`$topdir/.Trash-$uid`(`$uid`はユーザー固有の数字)

# specを解読した

解読の鍵となるのは

>https://specifications.freedesktop.org/trash-spec/trashspec-latest.html
>The following paragraph applies ONLY to the case when the implementation supports trashing in the top directory, and a $topdir/.Trash does not exist or has not passed the checks:

The following paragraphってのは`$topdir/.Trash-$uid`の生成の話。

1. `$topdir/.Trash`を作成できるのは**administratorだけ**((ファイルシステムが対応していたら)*sticky bit* を作成時に立てる)
2. すべてのuserは`$topdir/.Trash`が存在するとき、そこに書き込み権限を持っている
3. もし`$topdir/.Trash`が存在して、チェック項目(*sticky bit*とかsymbolic linkじゃないこととかとか。Trash specificationを参照されたし)をクリアしたら
    1. userは`$topdir/.Trash/$uid`を生成できる(実装は自動的に生成しなければならない**(MUST)**)
    2. userは`$topdir/.Trash/$uid`をゴミ箱ディレクトリとして使える
4. もし`$topdir/.Trash`が**が存在しなかった**もしくはチェック項目をクリアできなかった場合
    1. userは`$topdir/.Trash-$uid`を生成できる(実装は自動的に生成しなければならない**(MUST)**)
    2. userは`$topdir/.Trash-$uid`をゴミ箱ディレクトリとして使える

# ncaq氏の検証の考察

```
2017-10-15T22:21:11 ncaq@akaza/pts/7(0) /mnt/usbstick
% ll
合計 68K
drwxrwxrwx 1 root root  64K 10月 15 22:20 ./
drwxr-xr-x 9 root root 4.0K 10月 16  2015 ../
2017-10-15T22:21:11 ncaq@akaza/pts/7(0) /mnt/usbstick
% touch example
2017-10-15T22:21:17 ncaq@akaza/pts/7(0) /mnt/usbstick
% ll
合計 68K
drwxrwxrwx 1 root root  64K 10月 15 22:21 ./
drwxr-xr-x 9 root root 4.0K 10月 16  2015 ../
-rwxrwxrwx 1 root root    0 10月 15 22:21 example*
2017-10-15T22:21:19 ncaq@akaza/pts/7(0) /mnt/usbstick
% trash-put example
2017-10-15T22:21:31 ncaq@akaza/pts/7(0) /mnt/usbstick
% tree -a 
.
└── [drwxrwxrwx  240]  .Trash-1000/
    ├── [drwxrwxrwx  144]  files/
    │   └── [-rwxrwxrwx    0]  example*
    └── [drwxrwxrwx  168]  info/
        └── [-rwxrwxrwx   59]  example.trashinfo*

3 directories, 2 files
```

こんな実験をしたそうな。

これをさっきの解読結果を踏まえて考察すると、`$topdir/.Trash`が存在していない状況下なので、当然`$topdir/.Trash/$uid`は生成できない。なので`$topdir/.Trash-$uid`を生成してゴミ箱ディレクトリにしたよ、という状況だとわかる。

これってのはspecに合致していて問題ない。

# ncaq氏が問題にしていたtrash-cliのプログラム内のコメント

https://github.com/andreafrancia/trash-cli/blob/887996cb45496ebc30e6e6f2a40adf64fa21da32/trashcli/put.py#L135-L146

```python
        """
        Trash a file in the appropriate trash directory.
        If the file belong to the same volume of the trash home directory it
        will be trashed in the home trash directory.
        Otherwise it will be trashed in one of the relevant volume trash
        directories.
        Each volume can have two trash directories, they are
            - $volume/.Trash/$uid
            - $volume/.Trash-$uid
        Firstly the software attempt to trash the file in the first directory
        then try to trash in the second trash directory.
        """
```

これだ。言っていることとしては、`$volume/.Trash/$uid`がゴミ箱ディレクトリにできるかまず調べて、だめだったら`$volume/.Trash-$uid`をゴミ箱ディレクトリにするってことだから、ちょっと端折りすぎ感あるけどspecといっていることは変わらないので問題ない

# まとめ

という私の解釈があっているといいな(願望)

間違ってるよ、って人は
[trash-cli prefers $topdir/.Trash-$uid to the trash directory over $topdir/.Trash/$uid · Issue #108 · andreafrancia/trash-cli](https://github.com/andreafrancia/trash-cli/issues/108)
まで

# 追記

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">オッ</p>&mdash; エヌユル (@ncaq) <a href="https://twitter.com/ncaq/status/919606995631554561?ref_src=twsrc%5Etfw">2017年10月15日</a></blockquote>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なるほどね</p>&mdash; エヌユル (@ncaq) <a href="https://twitter.com/ncaq/status/919607018943528961?ref_src=twsrc%5Etfw">2017年10月15日</a></blockquote>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">私が間違っていたことが明らかになりなるほど~って感じ</p>&mdash; エヌユル (@ncaq) <a href="https://twitter.com/ncaq/status/919607666174935040?ref_src=twsrc%5Etfw">2017年10月15日</a></blockquote>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なぜ私はこれを読み飛ばしていたのか理解に苦しむねペチペチ</p>&mdash; エヌユル (@ncaq) <a href="https://twitter.com/ncaq/status/919609570288312320?ref_src=twsrc%5Etfw">2017年10月15日</a></blockquote>

>ncaq commented [2017年10月16日 2:17 JST](https://github.com/andreafrancia/trash-cli/issues/108#issuecomment-336726421)
>I misread Spec.
>I understand to implementation and comment of trash-cli is correct.
>Thank @yumetodo .
>I close this issue.

という感じでIssueが閉じた

# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC-BY_icon.svg#/media/File:CC-BY_icon.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/CC-BY_icon.svg/1200px-CC-BY_icon.svg.png" alt="CC-BY icon.svg" width="88px"></a>