yoesekolog

検索コスト削減のための自分用メモ。

s3 cp recursiveにおけるexcludeの挙動について

S3 recursive

S3のrecursiveオプションは便利なのでよく使うのですが、コピーされる際に除外したいフォルダがある場合に何か無いかなー。と思って調べたので、その雑記。

 

<環境>

 Win2k16、aws cli 2.1.25

<構成>

 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"』みたいな例ばかりで、取りたくないフォルダツリーを除外するのが見つからなかったので実験。

公式なんてみんな見ているだろうけど、参考元はこちら。

awscli.amazonaws.com