Ordner umbenennen und verschieben

Auf dieser Seite wird beschrieben, wie Sie Ordner in einem Bucket mit aktiviertem hierarchischen Namespace umbenennen und verschieben.

Beim Umbenennen werden ein Ordner, seine untergeordneten Ordner und zugehörige Ressourcen wie Objekte und verwaltete Ordner in einer einzigen atomaren Aktion rekursiv umbenannt.

Der Umbenennungsvorgang ist atomar. Der Vorgang wird entweder erfolgreich abgeschlossen und verschiebt Ressourcen auf ihren neuen Pfad oder schlägt mit einem Fehler fehl. Bei einem Fehler werden alle Ressourcen in ihren ursprünglichen Zustand zurückversetzt.

In einem Bucket mit aktiviertem hierarchischen Namespace ist das Umbenennen eines Ordners ein Metadatenvorgang. Die Objekte werden nicht physisch verschoben oder kopiert, sodass keine Kosten für das Kopieren von Objekten anfallen.

In einem Bucket ohne aktivierten hierarchischen Namespace werden jedoch Ordner simuliert. Wenn Sie einen simulierten Ordner umbenennen oder verschieben möchten, müssen Sie jedes darin enthaltene Objekt kopieren und löschen. Wenn der Ordner viele Objekte enthält, kann das Umbenennen ineffizient und kostspielig sein. Das Umbenennen oder Verschieben eines simulierten Ordners ist ebenfalls nicht atomar. Wenn der Vorgang fehlschlägt, befindet sich Ihr Bucket möglicherweise in einem inkonsistenten Zustand, in dem nur einige Objekte verschoben wurden.

Während des Umbenennens des Ordners können Sie die umzubenennenden Ressourcen lesen und auflisten. Sie können jedoch keine Schreibvorgänge für die betroffenen Ressourcen ausführen.

Durch das Umbenennen des Ordners wird ein lang andauernder Vorgang für einen Bucket initiiert.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Storage-Objekt-Nutzer (roles/storage.objectUser) für den Bucket zuzuweisen, um die erforderlichen Berechtigungen zum Umbenennen oder Verschieben von Ordnern in Buckets zu erhalten.

Weitere Informationen zum Zuweisen von Rollen auf Projekte finden Sie unter Zugriff auf Projekte verwalten.

Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

  • storage.folders.rename
    • Diese Berechtigung ist für den Quellordner erforderlich.
  • storage.folders.create
    • Diese Berechtigung ist für den Zielordner erforderlich.

Sie können die vorherigen Berechtigungen auch mit anderen benutzerdefinierten Rollen oder vordefinierten Rollen erhalten. Für eine großzügigere Rolle, mit der Sie zusätzlich zum Umbenennen von Ordnern auch Ordner verwalten können, bitten Sie Ihren Administrator, Ihnen eine der folgenden Rollen zuzuweisen:

  • Storage Folder Admin(roles/storage.folderAdmin)
  • Storage-Objekt-Administrator (roles/storage.objectAdmin)
  • Storage-Administrator (roles/storage.admin)

Informationen dazu, welche Rollen mit welchen Berechtigungen verknüpft sind, finden Sie unter IAM-Rollen für Cloud Storage.

Ordner umbenennen und verschieben

Console

  1. Wechseln Sie in der Cloud Console zur Seite Cloud Storage-Buckets.

    Buckets aufrufen

  2. Klicken Sie in der Bucket-Liste auf den Namen des Buckets, der den Ordner enthält, den Sie verschieben oder umbenennen möchten.

  3. Suchen Sie auf der Seite Bucket-Details den Ordner, den Sie verschieben oder umbenennen möchten.

  4. So benennen Sie den Ordner um:

    1. Klicken Sie auf das Dreipunkt-Menü  Weitere Aktionen des Ordners.

    2. Klicken Sie auf Ordner umbenennen.

    3. Geben Sie im eingeblendeten Fenster einen neuen Namen für den Ordner ein.

    4. Klicken Sie auf Umbenennen.

  5. Wenn Sie den Ordner in einen anderen Ordner verschieben möchten, gehen Sie so vor:

    1. Klicken Sie auf das Dreipunkt-Menü  Weitere Aktionen des Ordners.

    2. Klicken Sie auf Ordner verschieben.

    3. Klicken Sie im eingeblendeten Fenster auf Durchsuchen.

    4. Wählen Sie den Zielordner für den Ordner aus, den Sie verschieben möchten. Sie können auch auf  klicken, um einen neuen Ordner zu erstellen, bevor Sie ihn als Zielordner auswählen.

    5. Klicken Sie auf Auswählen.

    6. Klicken Sie auf Verschieben.

Unter Fehlerbehebung erfahren Sie, wie Sie detaillierte Fehlerinformationen zu fehlgeschlagenen Cloud Storage-Vorgängen in der Google Cloud Console abrufen.

Befehlszeile

Führen Sie den Befehl gcloud storage mv aus, um Ordner innerhalb eines Buckets mit hierarchischem Namespace umzubenennen oder zu verschieben:

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

Wobei:

  • BUCKET_NAME ist der Name des Buckets, der den Ordner enthält, den Sie umbenennen oder verschieben möchten. Beispiel: my-bucket.
  • FOLDER1 ist der Name des ursprünglichen Ordners, den Sie umbenennen oder verschieben möchten. Beispiel: my-src-folder.
  • FOLDER2 ist der neue Name des Zielordners. Beispiel: my-dest-folder. Wenn der von Ihnen gewählte neue Name bereits von einem vorhandenen Ordner verwendet wird, wird der ursprüngliche Ordner in den vorhandenen Ordner verschoben und wird zu einem Unterordner. Wenn Sie beispielsweise my-dest-folder in my-dest-folder1 umbenennen und my-dest-folder1 bereits vorhanden ist, lautet das Ergebnis my-dest-folder1/my-dest-folder/. Wenn der neue Name noch nicht existiert, wird der ursprüngliche Ordner an den neuen Namen umbenannt.

Die Antwort sieht in etwa so aus:

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

Clientbibliotheken

C++

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C++ API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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";
}

C#

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C# API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

using Google.Cloud.Storage.Control.V2;
using System;

public class StorageControlRenameFolderSample
{
    public Folder StorageControlRenameFolder(string bucketName = "your-unique-bucket-name",
        string sourceFolderName = "your_folder_name", string targetFolderName = "target_folder_name")
    {
        StorageControlClient storageControl = StorageControlClient.Create();

        string folderResourceName =
            // Set project to "_" to signify globally scoped bucket
            FolderName.FormatProjectBucketFolder("_", bucketName, sourceFolderName);

        var operation = storageControl.RenameFolder(folderResourceName, targetFolderName);
        var folder = operation.PollUntilCompleted().Result;

        Console.WriteLine($"Renamed folder {sourceFolderName} to {targetFolderName}");
        return folder;
    }
}

Go

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Go API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.


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

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Node.js API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

/**
 * 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

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage PHP API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Ruby API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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 APIs

JSON API

  1. Die gcloud CLI installieren und initialisieren, um ein Zugriffstoken für den Header Authorization zu generieren.

  2. Verwenden Sie cURL, um die JSON API mit einer Anfrage zum Umbenennen von Ordnern aufzurufen:

    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"

    Dabei gilt:

    • BUCKET_NAME ist der Name des Buckets, der den Ordner enthält, den Sie umbenennen oder verschieben möchten. Beispiel: my-bucket.
    • SOURCE_PATH ist der URL-codierte Pfad des Quellordners. Beispiel: my-src-folder/, URL-codiert als my-src-folder%2F.
    • DESTINATION_PATH ist der URL-codierte Pfad des Zielordners. Beispiel: my-dest-folder/, URL-codiert als my-dest-folder%2F.

Nächste Schritte

Überzeugen Sie sich selbst

Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit von Cloud Storage in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.

Cloud Storage kostenlos testen