シミュレートされたフォルダ

このページでは、Cloud Storage のフォルダの概要について説明します。

フォルダの概要

マネージド フォルダを除き、Cloud Storage はフラットな名前空間で動作します。つまり、実際には Cloud Storage 内にフォルダは存在しません。バケット your-bucketfolder1/file.txt という名前のオブジェクトを作成すると、そのオブジェクトへのパスは your-bucket/folder1/file.txt になりますが、folder1 という名前のフォルダはありません。代わりに、文字列 folder1 がオブジェクト名の一部になります。

ただし、Google Cloud コンソールと Cloud Storage CLI では、ファイルツリーが次のような階層構造で表示されます。

  • Google Cloud コンソールでは、ローカルのファイル ブラウザと同じようにフォルダが表示されます。

  • Cloud Storage CLI は、さまざまなルールを使用して一般的なコマンドライン ディレクトリをシミュレートします。

/storage/images/folders.svg

ツール

以下のタブをクリックすると、各ツールでのフォルダの処理方法を確認できます。

コンソール

Google Cloud コンソールでは、バケット内に空のフォルダを作成するか、既存のフォルダをアップロードできます。

既存のフォルダをアップロードすると、そのフォルダ内のすべてのオブジェクトのパスにフォルダ名が含まれます。サブフォルダとそこにあるオブジェクトもアップロードに含まれます。

フォルダを作成するには:

  1. Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。

    [バケット] に移動

  2. バケットに移動します。

  3. [フォルダを作成] をクリックして空のフォルダを新規に作成するか、[フォルダをアップロード] をクリックして既存のフォルダをアップロードします。

コマンドライン

疑似的な階層型ファイルツリーを実現するため、gcloud storage および gsutil コマンドは次のルールを適用して、コマンド内の宛先 URL をオブジェクト名として扱うか、フォルダとして扱うかを決定します。

  1. 宛先 URL が / 文字で終わる場合、CLI コマンドは宛先 URL をフォルダとして扱います。たとえば、次のコマンドを実行するとします。ここで、your-file はファイルの名前です。

    gcloud storage cp your-file gs://your-bucket/abc/

    このコマンドの結果として、Cloud Storage はバケット your-bucketabc/your-file という名前のオブジェクトを作成します。

  2. 複数のソースファイルを宛先 URL にコピーした場合、CLI では宛先 URL がフォルダとして扱われます。たとえば、次のコマンドを実行するとします。ここで、your-dirfile1file2 などのファイルを含むフォルダです。

    gcloud storage cp your-dir gs://your-bucket/abc --recursive

    このコマンドの結果として、Cloud Storage はバケット your-bucket にオブジェクト abc/your-dir/file1abc/your-dir/file2 を作成します。

  3. 上記のいずれのルールも当てはまらない場合、CLI はバケット内のオブジェクトを確認して、宛先 URL がオブジェクト名かフォルダかを判断します。たとえば、次のコマンドを実行するとします。ここで、your-file はファイルの名前です。

    gcloud storage cp your-file gs://your-bucket/abc

    CLI は、区切り文字に /、接頭辞に abc を指定して、your-bucket に対するオブジェクト一覧表示リクエストを行い、パスが abc/ で始まるオブジェクトが your-bucket にあるかどうかを判断します。その場合、CLI では abc/ がフォルダ名として扱われ、上記のコマンドによりバケット your-bucket にオブジェクト abc/your-file が作成されます。それ以外の場合、CLI ではオブジェクト abcyour-bucket に作成されます。

このルールベースのアプローチは、フォルダの存在を示すために 0 バイトのオブジェクトを作成する多くのツールの仕組みとは異なります。Cloud Storage CLI では、0 バイト オブジェクトの名前の末尾に _$folder$ を追加する規則など、これらのツールで使用されるいくつかの規則が理解されていますが、CLI では、UNIX コマンドの一貫した命名動作を実装するために、このようなマーカー オブジェクトは必要ありません。

再試行と命名

Cloud Storage CLI が中断されたリクエストを再試行すると、最初の試行ではファイルのサブセットがコピーされ、その後の試行では既存の宛先フォルダが検出され、オブジェクトの名前が正しく付けられないという問題が発生する可能性があります。

たとえば、次のコマンドを実行するとします。ここで、your-dir/ には dir1dir2 というサブフォルダが存在し、両サブフォルダにはファイル abc が含まれています。

gcloud storage cp ./your-dir gs://your-bucket/new --recursive

パス gs://your-bucket/new がまだ存在しない場合、CLI では最初の成功時に次のオブジェクトが作成されます。

new/dir1/abc
new/dir2/abc

ただし、同じコマンドが次回成功すると、CLI では次のオブジェクトが作成されます。

new/your-dir/dir1/abc
new/your-dir/dir2/abc

すべての試行で CLI が一貫して動作するように、次のことを試してください。

  1. 宛先 URL の末尾にスラッシュを追加すると、CLI では常にそのパスがフォルダとして扱われます。

  2. gcloud storage rsync または gsutil rsync を使用します。rsync は Unix cp で定義されるフォルダの命名規則を使用しません。宛先サブフォルダが存在するかどうかにかかわらず、一貫した命名を行います。

名前の構成の詳細については、cp を使用した名前の構成をご覧ください。

その他の情報

  • Cloud Storage CLI を使用して空のフォルダをシミュレートするために、ゼロバイトのオブジェクトを作成することはできません。

  • / はオブジェクト名の中の 1 文字にすぎない場合もあるため、CLI は gs://my-bucket/folder/gs://my-bucket//folder は異なるものと解釈します。スクリプト内でサブパスを組み合わせてファイルパスを作成する場合には注意してください。

REST API

JSON API

JSON API にフォルダは存在しません。オブジェクト リストを絞り込むには、prefixdelimiter クエリ パラメータを使用します。

たとえば、接頭辞 folder/subfolder/ を使用してバケット my-bucket 内のすべてのオブジェクトを一覧表示するには、次の URL を使用してオブジェクトの一覧表示リクエストを行います。

"https://storage.googleapis.com/storage/v1/b/my-bucket/o?prefix=folder/subfolder/"

XML API

XML API にフォルダは存在しませんが、prefixdelimiter クエリ パラメータを使用すると、オブジェクト リストを絞り込むことができます。

たとえば、接頭辞 folder/subfolder/ を使用してバケット my-bucket 内のすべてのオブジェクトを一覧表示するには、次の URL を使用してオブジェクトの一覧表示リクエストを行います。

"https://storage.googleapis.com/my-bucket?prefix=folder/subfolder/"

次のステップ