linux のファイルを削除するのに、どんな権限が必要かを調査しました。

linux のファイル権限って難しいですね。
ファイルを削除するのに、どんな権限が必要かを調査しましたので、メモを残します。

まず、使用する検証ツールを作る。

```sh:clear_folder.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    rm -rf ${ii}
done
```

```sh:create_folder.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    mkdir -m ${ii} ${ii} && cd ${ii}
    for kk in 640 641 642 643 644 645 646 647
    do
        touch ${kk}
        chmod ${kk} ${kk}
    done
    cd ..
done
```

```sh:check-f.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    for kk in 640 641 642 643 644 645 646 647
    do
        if [[ -f ${ii}/${kk} ]]; then
            echo ${ii}/${kk}
        fi
    done
done
```

```sh:check-rm-f.sh
#!/usr/bin/env bash -Ceuo pipefail

for ii in 640 641 642 643 644 645 646 647
do
    for kk in 640 641 642 643 644 645 646 647
    do
        rm -f ${ii}/${kk} && echo ${ii}/${kk}
    done
done
```

#### フォルダとファイルを作る(root)

```sh
id
uid=0(root) gid=0(root) groups=0(root)

sh create_folder.sh

ls -al
drwxrwxrwx. 10 root root 199  8月 30 00:00 .
dr-xr-xr-x. 18 root root 235  8月 29 23:19 ..
drw-r-----.  2 root root  94  8月 30 00:00 640
drw-r----x.  2 root root  94  8月 30 00:00 641
drw-r---w-.  2 root root  94  8月 30 00:00 642
drw-r---wx.  2 root root  94  8月 30 00:00 643
drw-r--r--.  2 root root  94  8月 30 00:00 644
drw-r--r-x.  2 root root  94  8月 30 00:00 645
drw-r--rw-.  2 root root  94  8月 30 00:00 646
drw-r--rwx.  2 root root  94  8月 30 00:00 647

find . -type f -ls
52669665    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./640/640
52669666    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./640/641
52669667    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./640/642
52669669    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./640/643
52669670    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./640/644
52669671    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./640/645
52669672    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./640/646
52669675    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./640/647
 1273542    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./641/640
 1273543    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./641/641
 1273544    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./641/642
 1273545    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./641/643
 1273546    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./641/644
 1273547    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./641/645
 1273548    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./641/646
 1273549    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./641/647
17935011    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./642/640
17935012    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./642/641
17935013    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./642/642
17935014    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./642/643
17935015    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./642/644
17935016    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./642/645
17935017    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./642/646
17935018    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./642/647
33755963    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./643/640
33755966    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./643/641
33755967    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./643/642
33755968    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./643/643
34138697    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./643/644
34138698    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./643/645
34138699    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./643/646
34138700    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./643/647
52669678    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./644/640
52669679    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./644/641
52669680    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./644/642
52669681    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./644/643
52669682    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./644/644
52669683    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./644/645
52669684    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./644/646
52669685    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./644/647
 1273551    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./645/640
 1273552    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./645/641
 1273553    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./645/642
 1273554    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./645/643
 1273555    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./645/644
 1273556    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./645/645
 1273557    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./645/646
 1273558    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./645/647
17935020    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./646/640
17935021    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./646/641
17935022    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./646/642
17935023    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./646/643
17935024    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./646/644
17935025    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./646/645
17935026    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./646/646
17935027    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./646/647
34670676    0 -rw-r-----   1 root     root     0  8月 30 00:00 ./647/640
35401047    0 -rw-r----x   1 root     root     0  8月 30 00:00 ./647/641
35401048    0 -rw-r---w-   1 root     root     0  8月 30 00:00 ./647/642
35401051    0 -rw-r---wx   1 root     root     0  8月 30 00:00 ./647/643
35401052    0 -rw-r--r--   1 root     root     0  8月 30 00:00 ./647/644
35401060    0 -rw-r--r-x   1 root     root     0  8月 30 00:00 ./647/645
35401061    0 -rw-r--rw-   1 root     root     0  8月 30 00:00 ./647/646
35401062    0 -rw-r--rwx   1 root     root     0  8月 30 00:00 ./647/647
```

#### sh でいつも使用するファイル存在チェック -f を検証(一般ユーザー)

```sh
id
uid=1001(koryo) gid=1001(koryo) groups=1001(koryo)

sh check-f.sh
641/640
641/641
641/642
641/643
641/644
641/645
641/646
641/647
643/640
643/641
643/642
643/643
643/644
643/645
643/646
643/647
645/640
645/641
645/642
645/643
645/644
645/645
645/646
645/647
647/640
647/641
647/642
647/643
647/644
647/645
647/646
647/647
```
よく見ると、641、643、645、647 のフォルダの下のすべてのファイルが存在することになっています。
つまり：
### 結論１：ファイルのフォルダに、x 権限さえあれば、ファイル存在チェックすることができる。たとえファイル自身に何も権限がなくても。

#### sh 内で rm を使ってファイルを削除するときはどうなる？(一般ユーザー)

```sh
id
uid=1001(koryo) gid=1001(koryo) groups=1001(koryo)

sh check-rm-f.sh
rm:	`640/640'	を削除できません：許可がありません
rm:	`640/641'	を削除できません：許可がありません
rm:	`640/642'	を削除できません：許可がありません
rm:	`640/643'	を削除できません：許可がありません
rm:	`640/644'	を削除できません：許可がありません
rm:	`640/645'	を削除できません：許可がありません
rm:	`640/646'	を削除できません：許可がありません
rm:	`640/647'	を削除できません：許可がありません
rm:	`641/640'	を削除できません：許可がありません
rm:	`641/641'	を削除できません：許可がありません
rm:	`641/642'	を削除できません：許可がありません
rm:	`641/643'	を削除できません：許可がありません
rm:	`641/644'	を削除できません：許可がありません
rm:	`641/645'	を削除できません：許可がありません
rm:	`641/646'	を削除できません：許可がありません
rm:	`641/647'	を削除できません：許可がありません
rm:	`642/640'	を削除できません：許可がありません
rm:	`642/641'	を削除できません：許可がありません
rm:	`642/642'	を削除できません：許可がありません
rm:	`642/643'	を削除できません：許可がありません
rm:	`642/644'	を削除できません：許可がありません
rm:	`642/645'	を削除できません：許可がありません
rm:	`642/646'	を削除できません：許可がありません
rm:	`642/647'	を削除できません：許可がありません
643/640
643/641
643/642
643/643
643/644
643/645
643/646
643/647
rm:	`644/640'	を削除できません：許可がありません
rm:	`644/641'	を削除できません：許可がありません
rm:	`644/642'	を削除できません：許可がありません
rm:	`644/643'	を削除できません：許可がありません
rm:	`644/644'	を削除できません：許可がありません
rm:	`644/645'	を削除できません：許可がありません
rm:	`644/646'	を削除できません：許可がありません
rm:	`644/647'	を削除できません：許可がありません
rm:	`645/640'	を削除できません：許可がありません
rm:	`645/641'	を削除できません：許可がありません
rm:	`645/642'	を削除できません：許可がありません
rm:	`645/643'	を削除できません：許可がありません
rm:	`645/644'	を削除できません：許可がありません
rm:	`645/645'	を削除できません：許可がありません
rm:	`645/646'	を削除できません：許可がありません
rm:	`645/647'	を削除できません：許可がありません
rm:	`646/640'	を削除できません：許可がありません
rm:	`646/641'	を削除できません：許可がありません
rm:	`646/642'	を削除できません：許可がありません
rm:	`646/643'	を削除できません：許可がありません
rm:	`646/644'	を削除できません：許可がありません
rm:	`646/645'	を削除できません：許可がありません
rm:	`646/646'	を削除できません：許可がありません
rm:	`646/647'	を削除できません：許可がありません
647/640
647/641
647/642
647/643
647/644
647/645
647/646
647/647
```

削除されたのは、以下のファイルたち：（643,647 の下すべてのファイル）
643/640,641,642,643,644,645,646,647
647/640,641,642,643,644,645,646,647

### 結論２：ファイルのフォルダに、w 権限さえあれば、ファイルに権限がなくても削除することができる。

以上