フォルダを名前変更および移動する

このページでは、階層型名前空間が有効になっているバケット内のフォルダを名前変更する方法と移動する方法を説明します。

名前変更オペレーションでは、フォルダ、その子フォルダ、関連するリソース(オブジェクトやマネージド フォルダなど)の名前が、単一のアトミック アクションで再帰的に変更されます。

名前変更オペレーションはアトミックです。このオペレーションは、正常に完了してリソースを新しいパスに移動するか、エラーで失敗します。エラーが発生した場合は、すべてのリソースが元の状態に復元されます。

階層型名前空間が有効になっているバケットでは、フォルダの名前変更はメタデータのみのオペレーションです。フォルダ内のオブジェクトを物理的に移動またはコピーするわけではないため、オブジェクトのコピー費用は発生しません。

ただし、階層型名前空間が有効になっていないバケットでは、フォルダがシミュレートされます。シミュレートされたフォルダの名前を変更したり、移動するには、そのフォルダ内の各オブジェクトをコピーして削除する必要があります。フォルダに多数のオブジェクトが含まれている場合、名前変更プロセスが非効率で、コストがかかる場合もあります。シミュレートされたフォルダの名前変更や移動は非アトミックです。つまり、処理が失敗した場合、一部のオブジェクトのみが移動され、バケットは不整合な状態になります。

フォルダの名前変更プロセス中に、名前が変更されるリソースを一覧表示できます。ただし、影響を受けるリソースに対して書き込みオペレーションを実行することはできません。

フォルダの名前変更オペレーションは、バケット上で長時間実行オペレーションを開始します。

必要なロール

バケット内のフォルダを名前変更または移動するために必要な権限を取得するには、バケットに対する Storage オブジェクト ユーザー(roles/storage.objectUser)IAM ロールを付与するよう管理者に依頼してください。

プロジェクトに対するロールの付与については、プロジェクトへのアクセス権を管理するをご覧ください。

必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

  • storage.folders.rename
    • この権限は、ソースフォルダに対して必要です。
  • storage.folders.create
    • この権限は、宛先フォルダに対して必要です。

上記の権限は、他のカスタムロール事前定義ロールを使用して取得することもできます。フォルダの名前変更に加えてフォルダの管理も可能なロールが必要な場合は、次のいずれかのロールを付与するよう管理者に依頼してください。

  • ストレージ フォルダ管理者(roles/storage.folderAdmin
  • Storage オブジェクト管理者(roles/storage.objectAdmin
  • ストレージ管理者(roles/storage.admin

どのロールがどの権限に関連付けられているかを確認するには、Cloud Storage に適用される IAM のロールをご覧ください。

フォルダを名前変更および移動する

コンソール

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

    [バケット] に移動

  2. バケットリストで、移動または名前を変更するフォルダを含むバケットの名前をクリックします。

  3. [バケットの詳細] ページで、移動または名前を変更するフォルダを見つけます。

  4. フォルダの名前を変更するには、次の操作を行います。

    1. フォルダの その他の操作)メニューをクリックします。

    2. [フォルダ名を変更] をクリックします。

    3. 表示されるオーバーレイ ウィンドウで、フォルダの新しい名前を入力します。

    4. [名前を変更] をクリックします。

  5. フォルダを別のフォルダに移動するには、次の操作を行います。

    1. フォルダの その他の操作)メニューをクリックします。

    2. [フォルダを移動] をクリックします。

    3. 表示されるオーバーレイ ウィンドウで [開く] をクリックします。

    4. フォルダを移動する宛先フォルダを選択します。 をクリックして新しいフォルダを作成してから、そのフォルダを宛先フォルダとして選択することもできます。

    5. [選択] をクリックします。

    6. [移動] をクリックします。

失敗した Cloud Storage オペレーションの詳細なエラー情報を Google Cloud コンソールで確認する方法については、トラブルシューティングをご覧ください。

コマンドライン

階層型名前空間を持つバケット内のフォルダを名前変更または移動するには、次のコマンドを実行します。

gcloud storage mv gs://BUCKET_NAME/FOLDER1 gs://BUCKET_NAME/FOLDER2

ここで

  • BUCKET_NAME は、名前変更または移動するフォルダを含むバケットの名前です。例: my-bucket
  • FOLDER1 は、名前変更または移動する元のフォルダの名前です。例: my-src-folder
  • FOLDER2 は、宛先フォルダの新しい名前です。例: my-dest-folder選択した新しい名前が既存のフォルダですでに使用されている場合、元のフォルダは既存のフォルダ内に移動され、子フォルダになります。たとえば、my-dest-folder の名前を my-dest-folder1 に変更した場合(my-dest-folder1 がすでに存在する場合)、結果は my-dest-folder1/my-dest-folder/ になります。選択した新しい名前がまだ存在しない場合は、元のフォルダの名前が新しい名前に変更されます。

次の例のようなレスポンスになります。

Copying gs://my-bucket/my-src-folder to gs://hns-bucket/my-dest-folder...

クライアント ライブラリ

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

namespace storagecontrol = google::cloud::storagecontrol_v2;
[](storagecontrol::StorageControlClient client,
   std::string const& bucket_name, std::string const& source_folder_id,
   std::string const& dest_folder_id) {
  auto name = std::string{"projects/_/buckets/"} + bucket_name + "/folders/" +
              source_folder_id;
  // Start a rename operation and block until it completes. Real applications
  // may want to setup a callback, wait on a coroutine, or poll until it
  // completes.
  auto renamed = client.RenameFolder(name, dest_folder_id).get();
  if (!renamed) throw std::move(renamed).status();

  std::cout << "Renamed: " << source_folder_id << " to: " << dest_folder_id
            << "\n";
}

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

import (
	"context"
	"fmt"
	"io"
	"time"

	control "cloud.google.com/go/storage/control/apiv2"
	"cloud.google.com/go/storage/control/apiv2/controlpb"
)

// renameFolder changes the name of an existing folder.
func renameFolder(w io.Writer, bucket, src, dst string) error {
	// bucket := "bucket-name"
	// src := "original-folder-name"
	// dst := "new-folder-name"

	ctx := context.Background()
	client, err := control.NewStorageControlClient(ctx)
	if err != nil {
		return fmt.Errorf("NewStorageControlClient: %w", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*30)
	defer cancel()

	// Construct source folder path including the bucket name.
	srcPath := fmt.Sprintf("projects/_/buckets/%v/folders/%v", bucket, src)

	req := &controlpb.RenameFolderRequest{
		Name:                srcPath,
		DestinationFolderId: dst,
	}
	op, err := client.RenameFolder(ctx, req)
	if err != nil {
		return fmt.Errorf("RenameFolder(%q): %w", srcPath, err)
	}

	// Wait for long-running operation to complete.
	f, err := op.Wait(ctx)
	if err != nil {
		return fmt.Errorf("waiting for RenameFolder: %w", err)
	}

	fmt.Fprintf(w, "folder %v moved to new path %v", srcPath, f.Name)
	return nil
}

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.api.gax.longrunning.OperationFuture;
import com.google.storage.control.v2.Folder;
import com.google.storage.control.v2.FolderName;
import com.google.storage.control.v2.RenameFolderMetadata;
import com.google.storage.control.v2.RenameFolderRequest;
import com.google.storage.control.v2.StorageControlClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public final class RenameFolder {

  public static void renameFolder(
      String bucketName, String sourceFolderName, String destinationFolderName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // The name of the bucket
    // String bucketName = "your-unique-bucket-name";

    // The name of the folder within the bucket
    // String sourceFolderName = "your-unique-source-folder-name";

    // The new name of the folder within the bucket
    // String destinationFolderName = "your-unique-destination-folder-name";

    try (StorageControlClient storageControl = StorageControlClient.create()) {

      // Set project to "_" to signify globally scoped bucket
      String sourceFolderResourceName = FolderName.format("_", bucketName, sourceFolderName);
      RenameFolderRequest request =
          RenameFolderRequest.newBuilder()
              .setName(sourceFolderResourceName)
              .setDestinationFolderId(destinationFolderName)
              .build();

      OperationFuture<Folder, RenameFolderMetadata> renameOperation =
          storageControl.renameFolderAsync(request);

      Folder destinationFolder = renameOperation.get(30, TimeUnit.SECONDS);

      System.out.printf(
          "Renamed folder from %s to %s%n", sourceFolderResourceName, destinationFolder.getName());
    }
  }
}

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */

// The name of your GCS bucket
// const bucketName = 'bucketName';

// The source folder name
// const sourceFolderName = 'currentFolderName';

// The destination folder ID
// const destinationFolderName = 'destinationFolderName';

// Imports the Control library
const {StorageControlClient} = require('@google-cloud/storage-control').v2;

// Instantiates a client
const controlClient = new StorageControlClient();

async function callRenameFolder() {
  const folderPath = controlClient.folderPath(
    '_',
    bucketName,
    sourceFolderName
  );

  // Create the request
  const request = {
    name: folderPath,
    destinationFolderId: destinationFolderName,
  };

  // Run request
  await controlClient.renameFolder(request);
  console.log(
    `Renamed folder ${sourceFolderName} to ${destinationFolderName}.`
  );
}

callRenameFolder();

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

use Google\Cloud\Storage\Control\V2\Client\StorageControlClient;
use Google\Cloud\Storage\Control\V2\RenameFolderRequest;

/**
 * Rename a folder in an existing bucket.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 *        (e.g. 'my-bucket')
 * @param string $sourceFolder The source folder ID.
 *        (e.g. 'my-folder')
 * @param string $destinationFolder The destination folder ID.
 *        (e.g. 'my-folder')
 */
function rename_folder(string $bucketName, string $sourceFolder, string $destinationFolder): void
{
    $storageControlClient = new StorageControlClient();

    // Set project to "_" to signify global bucket
    $formattedName = $storageControlClient->folderName('_', $bucketName, $sourceFolder);

    $request = new RenameFolderRequest([
        'name' => $formattedName,
        'destination_folder_id' => $destinationFolder,
    ]);

    $storageControlClient->renameFolder($request);

    printf('Renamed folder %s to %s', $sourceFolder, $destinationFolder);
}

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

from google.cloud import storage_control_v2


def rename_folder(
    bucket_name: str, source_folder_name: str, destination_folder_name: str
) -> None:
    # The ID of your GCS bucket
    # bucket_name = "your-unique-bucket-name"
    #
    # The source folder ID
    # source_folder_name = "current-folder-name"
    #
    # The destination folder ID
    # destination_folder_name = "new-folder-name"

    storage_control_client = storage_control_v2.StorageControlClient()
    # The storage bucket path uses the global access pattern, in which the "_"
    # denotes this bucket exists in the global namespace.
    source_folder_path = storage_control_client.folder_path(
        project="_", bucket=bucket_name, folder=source_folder_name
    )

    request = storage_control_v2.RenameFolderRequest(
        name=source_folder_path,
        destination_folder_id=destination_folder_name,
    )

    operation = storage_control_client.rename_folder(request=request)
    operation.result(60)

    print(f"Renamed folder {source_folder_name} to {destination_folder_name}")

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

Cloud Storage に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

def rename_folder bucket_name:, source_folder_id:, destination_folder_id:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"
  #
  # The source folder ID
  # source_folder_id = "current-folder-id"
  #
  # The destination folder ID, e.g. foo/bar/
  # destination_folder_id = "destination-folder-id"

  require "google/cloud/storage/control"

  storage_control = Google::Cloud::Storage::Control.storage_control

  # The storage folder path uses the global access pattern, in which the "_"
  # denotes this bucket exists in the global namespace.
  folder_path = storage_control.folder_path project: "_", bucket: bucket_name, folder: source_folder_id

  request = Google::Cloud::Storage::Control::V2::RenameFolderRequest.new name: folder_path,
                                                                         destination_folder_id: destination_folder_id

  storage_control.rename_folder request

  puts "Renamed folder #{source_folder_id} to #{destination_folder_id}"
end

REST API

JSON API

  1. gcloud CLI のインストールと初期化を行います。これにより、Authorization ヘッダーのアクセス トークンを生成できます。

  2. cURL を使用して、フォルダの名前変更リクエストJSON API を呼び出します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/folders/SOURCE_PATH/renameTo/folders/DESTINATION_PATH"

    ここで

    • BUCKET_NAME は、名前変更または移動するフォルダを含むバケットの名前です。例: my-bucket
    • SOURCE_PATH は、ソースフォルダの URL エンコードされたパスです。例: my-src-folder%2F として URL エンコードされている my-src-folder/
    • DESTINATION_PATH は、宛先フォルダの URL エンコードされたパスです。例: my-dest-folder%2F として URL エンコードされている my-dest-folder/

次のステップ

使ってみる

Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Cloud Storage のパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

Cloud Storage を無料で試す