rsync include exclude

色々研究

以下のディレクトリ構造の中から ./dA0 , ./dA1/dB1 , ./dA2/dB1/dC1/以下の全てのファイルを取得したい。

.
── dA0
│ ├── dB0
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dB1
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dB2
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
├── dA1
│ ├── dB0
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dB1
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dB2
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
└── dA2
├── dB0
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
├── dB1
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
└── dB2
├── dC0
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
├── dC1
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
└── dC2
├── f0.txt
├── f1.txt
└── f2.txt
39 directories, 81 files

各種のrsyncは以下の通りとなる。

rsync -n -av --include="/dA0/" --include="/dA0/" --exclude="" ./ ../testout 
rsync -n -av --include="/dA1/" --include="/dA1/dB1" --include="/dA1/dB1/" --exclude="" ./ ../testout
rsync -n -av --include="/dA2/" --include="/dA2/dB1/" --include="/dA2/dB1/dC1/" --include="/dA2/dB1/dC1/*" --exclude="" ./ ../testout

全部まとめると

rsync -n -av --include="/dA0/" --include="/dA0/" --include="/dA1/" --include="/dA1/dB1" --include="/dA1/dB1/" --include="/dA2/" --include="/dA2/dB1/" --include="/dA2/dB1/dC1/" --include="/dA2/dB1/dC1/*" --exclude="" ./ ../testout

簡単に解説

–include / –exclude の内容

最初が

最初の文字内容
/から始まると/foo先頭比較マッチ
/以外foo後方比較マッチ

最後が

最後の文字内容
/でないfoofoo というファイル1個
/foo/foo/ だけ
/*foo/*foo/ のディレクトリ1段分
/**foo/**再帰して取得

書いてある順に比較される

コピー対象になるにはヒットし続けなくてはならない。

ディレクトリの一部が欲しい場合

そこまで単品で include していかなくてはならない。以下の様に途中を抜かすと、dB1等が判定に現れないため、dC1/まで到達しない。

rsync -n -av --include="/dA2/ --include="/dA2/dB1/dC1/*" --exclude="" ./ ../testout

最後の–exclude=”*”は無いと全てがコピーされる。

途中のcacheディレクトリをコピーしたくない

.
├── dA0
│ ├── dB0
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dB1
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dB2
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ ├── f2.txt
│ │ └── temp
│ │ ├── 0.tmp
│ │ ├── 1.tmp
│ │ ├── 2.tmp
│ │ ├── 3.tmp
│ │ ├── 4.tmp
│ │ ├── 5.tmp
│ │ ├── 6.tmp
│ │ ├── 7.tmp
│ │ ├── 8.tmp
│ │ └── 9.tmp
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
├── dA1
│ ├── dB0
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dB1
│ │ ├── cache
│ │ │ ├── 0.swp
│ │ │ ├── 1.swp
│ │ │ ├── 2.swp
│ │ │ ├── 3.swp
│ │ │ ├── 4.swp
│ │ │ ├── 5.swp
│ │ │ ├── 6.swp
│ │ │ ├── 7.swp
│ │ │ ├── 8.swp
│ │ │ └── 9.swp
│ │ ├── dA2
│ │ │ └── dB2
│ │ │ └── dC2
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dB2
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
├── dA2
│ ├── dB0
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dB1
│ │ ├── dC0
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ ├── dC1
│ │ │ ├── f0.txt
│ │ │ ├── f1.txt
│ │ │ └── f2.txt
│ │ └── dC2
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dB2
│ ├── dC0
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ ├── dC1
│ │ ├── f0.txt
│ │ ├── f1.txt
│ │ └── f2.txt
│ └── dC2
│ ├── f0.txt
│ ├── f1.txt
│ └── f2.txt
└── txt11.txt
44 directories, 102 files

独特の除外ディレクトリは最初の方のに入れる。

rsync -n -av --exclude="cache/" --exclude="temp/" ./ ../testout

全部まとめると下記の通りとなる。

rsync -n -av --exclude="cache/" --exclude="temp/" --include="/dA0/" --include="/dA0/" --include="/dA1/" --include="/dA1/dB1" --include="/dA1/dB1/" --include="/dA2/" --include="/dA2/dB1/" --include="/dA2/dB1/dC1/" --include="/dA2/dB1/dC1/*" --exclude="" ./ ../testout

参考

仮のディレクトリ構造の作成用.py

'''
for i in range(3):
        for j in range(3):
            for k in range(3):
                print("mkdir -p dA" + str(i)+"/dB" + str(j)+"/dC" + str(k))
                for l in range(3):
                    print("touch dA" + str(i)+"/dB" + str(j)+"/dC" + str(k)+"/f" + str(l)+".txt")
'''

"""
print("mkdir -p temp")
for l in range(10):
    print("touch temp" +"/" + str(l)+".tmp")
"""