全力で怠けたい

怠けるために全力を尽くしたいブログ。

AWS CLI の S3 のファイルの --exclude と --include の使い方のメモ。

AWS CLIaws 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 CLIaws s3 sync とか aws s3 cp コマンドはパスを指定する引数は UNIX スタイルのワイルドカードは使えないけど --exclude オプションと --include オプションを使うと UNIXワイルドカードとだいたい同じことができる。

--exclude オプションと --include オプションは雰囲気で使ってるけど少しひっかかりがあったので軽く調べてみたのをメモしておく。

このあとのコマンドの実行でのローカルのディレクトリとファイル構成はこんな感じでやっていく。

ファイル名が a, ab, bc のやつがそれぞれ .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 でベースが ab のファイルを除外する。

$ 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.txtb.txt は除外するけど child サブディレクトリ配下の a.txtb.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.txtb.txt だけじゃなくて child サブディレクトリ配下の a.txtb.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 CLIaws 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

参考サイト