gsutil、aws s3での基本的なファイル操作（Google Cloud Storage、S3）

`aws s3`コマンドはS3しか操作できませんが、Google Cloud Storage(GCS)のCLIである`gsutil`コマンドはGCSだけでなくS3に対しても同じように操作できます。

# ファイルのアップロード（ローカルからクラウド）

```
$ gsutil cp dir/foo.txt gs://xxx-bucket/dir/
$ gsutil cp dir/foo.txt s3://yyy-bucket/dir/
$ aws s3 cp dir/foo.txt s3://yyy-bucket/dir/
```
※`g3://xxx-bucket/dir/foo.txt`または`s3://yyy-bucket/dir/foo.txt`にファイルができます

ローカルでのパイプからのアップロード

```
$ cat dir/foo.txt | gsutil cp - gs://xxx-bucket/dir/foo.txt
$ cat dir/foo.txt | gsutil cp - s3://yyy-bucket/dir/foo.txt
$ cat dir/foo.txt | aws s3 cp - s3://yyy-bucket/dir/foo.txt
```
※Google Cloud Storage上でContent-Typeがapplication/octed-streamになってしまう
※コピー先はファイル名まで指定が必要

`gsutil cp`や`aws s3 cp`の`-`は標準入力の意味です。

いずれの方法でもアップロード先に指定のディレクトリがない場合は自動で作られるかのように振る舞います。

正確にはGoogle Cloud StorageもS3もオブジェクトストレージで、ファイルシステムとは異なり、ディレクトリもしくはフォルダの概念は本来はありません。以下の記事がわかりやすいです。

[Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/)

Google Cloud StorageのファイルのContent-Typeを変更するには以下のようにします。

```
$ gsutil setmeta -h "Content-Type:text/plain" gs://xxx-bucket/dir/foo.txt
```
※`-h`オプションはgsのファイルパスよりも先に指定する必要あり

コピー時にContent-Typeを指定するには以下のようにします。

```
$ cat dir/foo.txt | gsutil -h "Content-Type:text/plain" cp - gs://xxx-bucket/dir/foo.txt
```
※`-h`オプションは`cp`よりも前に指定する必要あり

# ファイルの一覧表示（ローカルおよびクラウド）

```
$ ls -l dir/
$ gsutil ls -l gs://xxx-bucket/dir/
$ gsutil ls -l s3://yyy-bucket/dir/
$ aws s3 ls s3://yyy-bucket/dir/
```
※`aws s3`コマンドには`-l`オプションがありません

参考
`gsutil ls`はS3にも対応している件
[Google Cloud StorageとAWS S3との間でファイルをコピーするには](https://qiita.com/suzuki-navi/items/cf92371e71cb4d106300)

# ファイルの表示（ローカルおよびクラウド）

プレーンテキストのファイルをターミナル上に表示する方法です。ローカルのファイルに対する`cat`コマンドに相当するものです。

```
$ cat dir/foo.txt
$ gsutil cp gs://xxx-bucket/dir/foo.txt -
$ gsutil cp s3://yyy-bucket/dir/foo.txt -
$ aws s3 cp s3://yyy-bucket/dir/foo.txt -
```

`gsutil cp`や`aws s3 cp`の`-`は標準出力の意味です。

# ファイルのダウンロード（クラウドからローカル）

```
$ gsutil cp gs://xxx-bucket/dir/foo.txt dir/
$ gsutil cp s3://yyy-bucket/dir/foo.txt dir/
$ aws s3 cp s3://yyy-bucket/dir/foo.txt dir/
```

# ファイル名の変更（ローカルおよびクラウド）

```
$ mv dir/foo.txt dir/bar.txt
$ gsutil mv dir/foo.txt dir/bar.txt
$ gsutil mv gs://xxx-bucket/dir/foo.txt gs://xxx-bucket/dir/bar.txt
$ gsutil mv s3://yyy-bucket/dir/foo.txt s3://yyy-bucket/dir/bar.txt
$ aws s3 mv s3://yyy-bucket/dir/foo.txt s3://yyy-bucket/dir/bar.txt
```

`gsutil mv`はGoogle Cloud Storage(GCS)だけでなくS3やローカルのファイルの名前も変更できます。

また、`gsutil mv`はローカルからGCS、GCSからローカル、GCSの異なるバケット間、ローカルからS3、S3からローカル、S3の異なるバケット間、GCSからS3、S3からGCSの移動もできます。

`aws s3 mv`はローカルからS3、S3からローカル、S3の異なるバケット間の移動もできます。


# ファイルの削除（ローカルおよびクラウド）

```
$ rm dir/foo.txt
$ gsutil rm gs://xxx-bucket/dir/foo.txt
$ gsutil rm s3://yyy-bucket/dir/foo.txt
$ aws s3 rm s3://yyy-bucket/dir/foo.txt
```

Google Cloud StorageもS3もファイルシステムではなくオブジェクトストレージなので、`dir/foo.txt`を削除した結果、`dir`の中に1つもオブジェクトがなくなれば`dir`自体も自動で削除されるかのように振る舞います。

# ディレクトリの容量確認（ローカルおよびクラウド）

```
$ du -sh dir/
$ gsutil du -sh gs://xxx-bucket/dir/
$ gsutil du -sh s3://yyy-bucket/dir/
$ aws s3 ls --human --recursive --sum s3://yyy-bucket/dir/
```

参考
[ディレクトリの合計容量を確認するには(local, GCS, S3) - Qiita](https://qiita.com/suzuki-navi/items/b18b92f15cf36a4a840a)