s3 cp recursiveにおけるexcludeの挙動について
S3 recursive
S3のrecursiveオプションは便利なのでよく使うのですが、コピーされる際に除外したいフォルダがある場合に何か無いかなー。と思って調べたので、その雑記。
<環境>
<構成>
C:\temp\WORK\pre\script : 対象
C:\temp\WORK\pre\param : 対象
C:\temp\WORK\pre\log : 非対象
C:\temp\WORK\pre\tmp : 非対象
<recursiveの挙動>
tmpとlogもバックアップされてしまうので、処理が動いているとlogファイルやtmpファイルが対象になってしまい、タイミングによってchecksumでエラーになってバックアップが失敗したりする。
とはいえ、1個1個 s3 cp を打つのはアホ過ぎる。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive
upload: WORK\pre\log\dummy.log to s3://bktest/pre/log/dummy.log
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
upload: WORK\pre\tmp\dummy.tmp to s3://bktest/pre/tmp/dummy.tmp
C:\temp>
<excludeの挙動>
excludeで指定した物が『除外される』という仕様。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive --exclude "*.log"
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
upload: WORK\pre\tmp\dummy.tmp to s3://bktest/pre/tmp/dummy.tmp
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
C:\temp>
<excludeでフォルダを除外:NG>
パスの一部を指定してみるができない。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive --exclude "\log\"
upload: WORK\pre\tmp\dummy.tmp to s3://bktest/pre/tmp/dummy.tmp
upload: WORK\pre\log\dummy.log to s3://bktest/pre/log/dummy.log
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
C:\temp>
<excludeでフォルダを除外:OK>
正規表現が使えるのと、あくまでもオブジェクト指定なので、*\ で囲ってみる。
これはできる。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive --exclude "*\log\*"
upload: WORK\pre\tmp\dummy.tmp to s3://bktest/pre/tmp/dummy.tmp
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
C:\temp>
<excludeでフォルダを除外:NG>
パス指定を諦めない。WORKから指定してみたができない。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive --exclude "WORK\pre\log\*"
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
upload: WORK\pre\log\dummy.log to s3://bktest/pre/log/dummy.log
upload: WORK\pre\tmp\dummy.tmp to s3://bktest/pre/tmp/dummy.tmp
C:\temp>
<excludeでフォルダを除外:OK>
upload: で始まるパスに騙されていた。指定パスの直下から指定できた。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive --exclude "pre\log\*"
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
upload: WORK\pre\tmp\dummy.tmp to s3://bktest/pre/tmp/dummy.tmp
C:\temp>
複数条件も試しておいたが、無事に除外できた。
C:\temp>aws s3 cp .\WORK s3://bktest/ --recursive --exclude "pre\log\*" --exclude "pre\tmp\*"
upload: WORK\pre\param\dummy.param to s3://bktest/pre/param/dummy.param
upload: WORK\pre\script\dummy.ps1 to s3://bktest/pre/script/dummy.ps1
C:\temp>
サイトを巡回していて、『--exclude "*" --include "*.txt"』みたいな例ばかりで、取りたくないフォルダツリーを除外するのが見つからなかったので実験。
公式なんてみんな見ているだろうけど、参考元はこちら。