AWS CLI の S3 のファイルの --exclude と --include の使い方のメモ。
AWS CLI の aws s3 sync
とか aws s3 cp
コマンドとかの --exclude
オプションと --include
オプションの使い方のメモ。
aws コマンドのバージョン。
$ aws --version aws-cli/2.1.21 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off
--exclude
オプションと --include
オプションの使い方
AWS CLI の aws s3 sync
とか aws s3 cp
コマンドはパスを指定する引数は UNIX スタイルのワイルドカードは使えないけど --exclude
オプションと --include
オプションを使うと UNIX のワイルドカードとだいたい同じことができる。
--exclude
オプションと --include
オプションは雰囲気で使ってるけど少しひっかかりがあったので軽く調べてみたのをメモしておく。
このあとのコマンドの実行でのローカルのディレクトリとファイル構成はこんな感じでやっていく。
ファイル名が a
, ab
, b
と c
のやつがそれぞれ .csv
, .txt
の拡張子と組み合わせたファイルを配置している。
$ tree ./data ./data ├── a.csv ├── a.txt ├── ab.csv ├── ab.txt ├── b.csv ├── b.txt ├── c.csv └── c.txt
パターン記号
--exclude
オプションと --include
オプションは UNIX のワイルドカードみたいなパターン記号が使える。
--exclude
オプションと --include
オプションが使えるパターン記号と意味はこんな感じ。
パターン記号 | 意味 |
---|---|
* | 任意の文字列にマッチする |
? | 任意の1文字にマッチする |
[sequence] | sequence の任意の1文字にマッチする |
[!sequence] | sequence にない任意の1文字にマッチする |
パターン記号をいくつか試してみる。
--exclude '*'
を指定してすべてのファイルを除外する。
$ aws s3 sync --dryrun --exclude '*' ./data s3://alice-s3-bucket/data
--exclude '*.csv'
を指定して拡張子が .csv
のファイルを除外する。
$ aws s3 sync --dryrun --exclude '*.csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt (dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
--exclude '?.csv'
を指定して拡張子が .csv
でベースが任意の1文字のファイルを除外する。
$ aws s3 sync --dryrun --exclude '?.csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt (dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt (dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
--exclude '[ab].csv'
を指定して拡張子が .csv
でベースが a
か b
のファイルを除外する。
$ aws s3 sync --dryrun --exclude '[ab].csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt (dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt (dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt (dryrun) upload: data/c.csv to s3://alice-s3-bucket/c.csv (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
--exclude '[!ab].csv'
を指定して拡張子が .csv
でベースが a
でも b
でもないファイルつまり c.csv
を除外する。
$ aws s3 sync --dryrun --exclude '[!ab].csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.csv to s3://alice-s3-bucket/a.csv (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt (dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt (dryrun) upload: data/b.csv to s3://alice-s3-bucket/b.csv (dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
--exclude
オプションと --include
オプションの適用ルール
--exclude
オプションと --include
オプションの指定はいくつかルールがある。それぞれのルールの説明をメモしておく。
--exclude
オプションと--include
オプションはそれぞれ0回または1回以上指定できる--exclude
オプションと--include
オプションは後に指定するほうが優先する--exclude
オプションと--include
オプションはソースディレクトリに対して評価する--include
オプションは--exclude
オプションと組み合わせて使う
それぞれ0回または1回以上指定できる
--exclude
オプションと --include
オプションはそれぞれ0回または1回以上指定できる。
--exclude '?.csv'
を指定すると拡張子が .csv
でベースが任意の1文字のファイルを除外するけど --exclude '?.csv' --exclude '?.txt'
みたいに指定すると拡張子が .txt
でベースが任意の1文字のファイルも除外する。
$ aws s3 sync --dryrun --exclude '?.csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt (dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt (dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt $ aws s3 sync --dryrun --exclude '?.csv' --exclude '?.txt' ./data s3://alice-s3-bucket (dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
後に指定するほうが優先する
--exclude
オプションと --include
オプションは後に指定するほうが優先する後勝ちルール。
後勝ちルールは名前のとおりで --exclude
オプションの指定と --include
オプションの指定の両方にマッチするファイルがあるときは後に指定するほうのルールが優先するルール。
たとえば --exclude '*' --include 'a.txt'
みたいに指定すると、評価の順番は --exclude '*'
にマッチするファイルつまりすべてのファイルを除外する => --include 'a.txt'
にマッチする a.txt
は除外せずに含めるという順番に評価するので、 a.txt
だけが aws s3 sync
コマンドの処理対象になる。
$ aws s3 sync --dryrun --exclude '*' --include 'a.txt' ./data s3://alice-s3-bucket (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
--exclude
と --include
を指定する順番を入れ替えて --include 'a.txt' --exclude '*'
みたいに指定すると、評価の順番は --include 'a.txt'
にマッチする a.txt
は除外せずに含める => --exclude '*'
にマッチするファイルつまりすべてのファイルを除外する順番に評価するので、aws s3 sync
コマンドの処理対象のファイルはない。
$ aws s3 sync --dryrun --include 'a.txt' --exclude '*' ./data s3://alice-s3-bucket
後勝ちルールは --exclude
と --include
を組み合わせるときに意味が出てくるルールで --exclude
だけあるいは --include
だけを組み合わせるときは別に気にしなくていい。
ソースディレクトリに対して評価する
--exclude
オプションと --include
オプションはソースディレクトリに対して評価する。
理解しやすくするのにローカルのディレクトリとファイル構成はこんな感じにしてみる。
$ tree ./data ./data ├── a.txt ├── b.txt ├── c.txt └── child ├── a.txt ├── b.txt └── c.txt
--exclude '[ab].txt'
を指定するとソースディレクトリ直下の a.txt
と b.txt
は除外するけど child
サブディレクトリ配下の a.txt
と b.txt
は除外しない。
$ aws s3 sync --dryrun --exclude '[ab].txt' ./data s3://alice-s3-bucket (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt (dryrun) upload: data/child/a.txt to s3://alice-s3-bucket/child/a.txt (dryrun) upload: data/child/b.txt to s3://alice-s3-bucket/child/b.txt (dryrun) upload: data/child/c.txt to s3://alice-s3-bucket/child/c.txt
--exclude '[ab].txt' --exclude '*/[ab].txt'
を指定するとソースディレクトリ直下の a.txt
と b.txt
だけじゃなくて child
サブディレクトリ配下の a.txt
と b.txt
も除外する。
$ aws s3 sync --dryrun --exclude '[ab].txt' --exclude '*/[ab].txt' ./data s3://alice-s3-bucket (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt (dryrun) upload: data/child/c.txt to s3://alice-s3-bucket/child/c.txt
--include
オプションは --exclude
オプションと組み合わせて使う
AWS CLI の aws s3 sync
とか aws s3 cp
コマンドはデフォルトですべてのファイルが処理対象なので --include
オプションだけを指定するとすべてのファイルが処理対象になる。
たとえば以下はすべて同じ結果になる。
$ aws s3 sync --dryrun ./data s3://alice-s3-bucket $ aws s3 sync --dryrun --include '*' ./data s3://alice-s3-bucket $ aws s3 sync --dryrun --include '*.csv' ./data s3://alice-s3-bucket
--include
オプションだけを指定しても意味がなくて --include
オプションは --exclude
オプションと組み合わせて使うことによって効果が発揮する。
よく使うやつ
自分がよく使う --exclude
オプションと --include
オプションの使い方を書いていく。
特定のファイル以外を処理するときは --exclude
オプションで特定のファイルを除外する。たとえば拡張子が .csv
以外のファイルを処理するときは --exclude '*.csv'
を指定して拡張子が .csv
のファイルを除外する。
$ aws s3 sync --dryrun --exclude '*.csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt (dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt (dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt (dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
特定のファイルだけ処理するときは --exclude '*'
ですべてのファイルを除外してから --include
オプションで特定のファイルを含める。たとえば拡張子が .csv
のファイルだけを処理するときは --exclude '*' --include '*.csv'
を指定してすべてのファイルを除外してから拡張子が .csv
のファイルだけを含める。
$ aws s3 sync --dryrun --exclude '*' --include '*.csv' ./data s3://alice-s3-bucket (dryrun) upload: data/a.csv to s3://alice-s3-bucket/a.csv (dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv (dryrun) upload: data/b.csv to s3://alice-s3-bucket/b.csv (dryrun) upload: data/c.csv to s3://alice-s3-bucket/c.csv