rsync --exclude dirname、子階層のdirnameまで除外されるので注意

# 経緯

- rsyncの `--include` `--exclude` には癖があると過去の経験で感じつつも
- 急いでスクリプトを書くと、配慮が行き届かず、
- 思わぬ事故になる（なった）ので、簡単ではあるがメモを残しておく

# 環境

- WSL (Ubuntu 20.04)
- rsync  version 3.1.3  protocol version 31

# フォルダ構成

```
.
├── 01_rsync_test.bash
├── dir_tree.txt
├── dst
└── src
    ├── exclude_me
    │   └── exclude_me.txt
    └── sub
        └── exclude_me
            └── exclude_me.txt
```

# テスト概要

```bash
#!/bin/bash

tree . > dir_tree.txt

rsync -avn src/ dst/ > test01.txt
rsync -avn --exclude exclude_me src/ dst/ > test02.txt
rsync -avn --exclude exclude_me/ src/ dst/ > test03.txt
rsync -avn --exclude ./exclude_me src/ dst/ > test04.txt
rsync -avn --exclude ./exclude_me/ src/ dst/ > test05.txt
rsync -avn --exclude src/exclude_me src/ dst/ > test11.txt
rsync -avn --exclude src/exclude_me/ src/ dst/ > test12.txt
rsync -avn --exclude ./src/exclude_me src/ dst/ > test13.txt
rsync -avn --exclude ./src/exclude_me/ src/ dst/ > test14.txt
rsync -avn --exclude /home/user/rsync/src/exclude_me/ src/ dst/ > test21.txt
rsync -avn --exclude /home/user/rsync/src/exclude_me/ src/ dst/ > test22.txt
rsync -avn --exclude sub/exclude_me src/ dst/ > test31.txt
rsync -avn --include sub/exclude_me --exclude exclude_me src/ dst/ > test41.txt
rsync -avn --exclude exclude_me --include sub/exclude_me src/ dst/ > test42.txt
```

# テスト結果

## Test01

- `--exclude` を指定しない
- すべて同期される

```bash
rsync -avn src/ dst/ > test01.txt
```

```bash
sending incremental file list
./
exclude_me/
exclude_me/exclude_me.txt
sub/
sub/exclude_me/
sub/exclude_me/exclude_me.txt
```


## Test02

- `--exclude` でディレクトリ名指定
- 一致するディレクトリ名がすべて除外される

```bash
rsync -avn --exclude exclude_me src/ dst/ > test02.txt
```

```bash
sending incremental file list
./
sub/
```

## Test03

- `--exclude` でsrcからの相対パスで指定、/を末尾に付与
- 一致するディレクトリ名がすべて除外される

```bash
rsync -avn --exclude exclude_me/ src/ dst/ > test03.txt
```

```bash
sending incremental file list
./
sub/
```


## Test04

- `--exclude` でsrcからの相対パスで指定、./を先頭に付与
- 除外されない

```bash
rsync -avn --exclude ./exclude_me src/ dst/ > test04.txt
```

```bash
sending incremental file list
./
exclude_me/
exclude_me/exclude_me.txt
sub/
sub/exclude_me/
sub/exclude_me/exclude_me.txt
```


## Test05

- `--exclude` でsrcからの相対パスで指定、./を先頭に付与、/を末尾に付与
- 除外されない

```bash
rsync -avn --exclude ./exclude_me/ src/ dst/ > test05.txt
```

```bash
sending incremental file list
./
exclude_me/
exclude_me/exclude_me.txt
sub/
sub/exclude_me/
sub/exclude_me/exclude_me.txt
```



## Test11-14

- `--exclude` でカレントディレクトリから指定
- 除外されない

```bash
rsync -avn --exclude src/exclude_me src/ dst/ > test11.txt
rsync -avn --exclude src/exclude_me/ src/ dst/ > test12.txt
rsync -avn --exclude ./src/exclude_me src/ dst/ > test13.txt
rsync -avn --exclude ./src/exclude_me/ src/ dst/ > test14.txt
```

```bash
sending incremental file list
./
exclude_me/
exclude_me/exclude_me.txt
sub/
sub/exclude_me/
sub/exclude_me/exclude_me.txt
```

## Test21-22

- `--exclude` で絶対パスで指定
- 除外されない

```bash
rsync -avn --exclude /home/user/rsync/src/exclude_me src/ dst/ > test21.txt
rsync -avn --exclude /home/user/rsync/src/exclude_me/ src/ dst/ > test22.txt
```

```bash
sending incremental file list
./
exclude_me/
exclude_me/exclude_me.txt
sub/
sub/exclude_me/
sub/exclude_me/exclude_me.txt
```


## Test31

- `--exclude` でsubディレクトリ以下を指定
- subディレクトリのみが除外されて、親階層は除外されない

```bash
rsync -avn --exclude sub/exclude_me src/ dst/ > test31.txt
```

```bash
sending incremental file list
./
exclude_me/
exclude_me/exclude_me.txt
sub/
```


## Test41

- `--exclude` でsubディレクトリを指定
- `--exclude` より `--include` を先に指定する
- 親階層のみ除外される

```bash
rsync -avn --include sub/exclude_me --exclude exclude_me src/ dst/ > test41.txt
```

```bash
sending incremental file list
./
sub/
sub/exclude_me/
sub/exclude_me/exclude_me.txt
```

## Test42

- `--include` でsubディレクトリを指定
- --exlucdeの後に--includeを指定
- すべて除外される（ `--include` が効かない）

```bash
rsync -avn --exclude exclude_me --include sub/exclude_me src/ dst/ > test42.txt
```

```bash
sending incremental file list
./
sub/
```