Rinominare le cartelle

In questa pagina viene descritto come rinominare le cartelle in un bucket dello spazio dei nomi gerarchico abilitato.

L'operazione di ridenominazione rinomina in modo ricorsivo una cartella, le relative cartelle secondarie e risorse associate, inclusi oggetti e cartelle gestite un'azione.

L'operazione di ridenominazione è atomica. L'operazione viene completata correttamente sposta le risorse nel nuovo percorso o non va a buon fine con un errore. In caso di errore, tutte le risorse vengono ripristinate allo stato originale.

In un bucket in cui è abilitato lo spazio dei nomi gerarchico, la ridenominazione di una cartella un'operazione basata solo sui metadati. Non prevede lo spostamento o la copia fisica oggetti all'interno della cartella, quindi non vengono addebitati costi di copia degli oggetti.

Tuttavia, in un bucket senza uno spazio dei nomi gerarchico abilitato, le cartelle vengono simulato. La ridenominazione o lo spostamento di una cartella simulata richiede la copia e l'eliminazione di ogni oggetto al suo interno. Se la cartella contiene molti oggetti, il processo di ridenominazione può essere inefficiente e costoso. Anche la ridenominazione o lo spostamento di una cartella simulata non è atomico, il che significa che, se il processo non riesce, il bucket potrebbe rimanere in uno stato incoerente e spostare solo alcuni oggetti.

Durante il processo di ridenominazione della cartella, puoi leggere ed elencare le risorse che vengono rinominate. Tuttavia, non puoi eseguire operazioni di scrittura sulle risorse interessate.

L'operazione di ridenominazione della cartella avvia un'operazione a lunga esecuzione in un bucket.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per rinominare le cartelle nei bucket, chiedi all'amministratore di concederti le autorizzazioni Ruolo IAM Utente oggetto (roles/storage.objectUser) nel bucket.

Per ulteriori informazioni sulla concessione dei ruoli nei progetti, consulta Gestire l'accesso ai progetti.

Per vedere con esattezza le autorizzazioni necessarie, espandi la sezione Sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

  • storage.folders.rename
    • Questa autorizzazione è necessaria per la cartella di origine.
  • storage.folders.create
    • Questa autorizzazione è necessaria per la cartella di destinazione.

Puoi anche ottenere le autorizzazioni precedenti con altri ruoli personalizzati o ruoli predefiniti. Per un ruolo più permissivo che consenta di gestire le cartelle oltre a rinominare le cartelle, chiedi all'amministratore di concederti uno dei ruoli:

  • Amministratore cartelle Storage (roles/storage.folderAdmin)
  • Amministratore oggetti Storage (roles/storage.objectAdmin)
  • Amministratore Storage (roles/storage.admin)

Per sapere quali ruoli sono associati a quali autorizzazioni, vedi Ruoli IAM per Cloud Storage.

Rinominare una cartella

Riga di comando

Per rinominare le cartelle all'interno di un bucket con spazio dei nomi gerarchico, esegui il seguente comando:

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

Dove:

  • BUCKET_NAME è il nome del bucket contiene la cartella che vuoi rinominare. Ad esempio, my-bucket.
  • FOLDER1 è il nome della cartella originale che vuoi rinominare. Ad esempio, my-src-folder.
  • FOLDER2 è il nuovo nome della cartella di destinazione. Ad esempio, my-dest-folder. Se il nuovo nome che scegli è già utilizzato da una cartella esistente, la cartella originale viene spostata all'interno di quella esistente, diventando una cartella secondaria. Ad esempio, se rinomini my-dest-folder in my-dest-folder1 (ed esiste già my-dest-folder1), il risultato è my-dest-folder1/my-dest-folder/. Se il nuovo nome scelto non esiste già, la cartella originale viene rinominata in modo che corrisponda al nuovo nome.

La risposta è simile al seguente esempio:

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

Librerie client

C++

Per ulteriori informazioni, consulta API Cloud Storage C++ documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per ulteriori informazioni, consulta API Cloud Storage Go documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per ulteriori informazioni, consulta API Cloud Storage Java documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.


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

Per ulteriori informazioni, consulta API Cloud Storage Node.js documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

/**
 * 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 = `projects/_/buckets/${bucketName}/folders/${sourceFolderName}`;

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

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

callRenameFolder();

PHP

Per ulteriori informazioni, consulta API Cloud Storage PHP documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per ulteriori informazioni, consulta API Cloud Storage Python documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per ulteriori informazioni, consulta API Cloud Storage Ruby documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

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

API REST

API JSON

  1. Avere gcloud CLI installato e inizializzato, per generare un token di accesso per l'intestazione Authorization.

    In alternativa, puoi creare un token di accesso utilizzando il metodo OAuth 2.0 Playground e includilo nell'intestazione Authorization.

  2. Utilizza cURL per chiamare l'API JSON con un richiedi di rinominare le cartelle:

    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"

    Dove:

    • BUCKET_NAME è il nome del bucket contiene la cartella che vuoi rinominare. Ad esempio, my-bucket.
    • SOURCE_PATH è il percorso con codifica URL della cartella di origine. Ad esempio, my-src-folder/ con URL codificato come my-src-folder%2F.
    • DESTINATION_PATH è il percorso con codifica URL della cartella di destinazione. Ad esempio, my-dest-folder/ con URL codificato come my-dest-folder%2F.

Passaggi successivi

Provalo

Se non conosci Google Cloud, crea un account per valutare le prestazioni di Cloud Storage in scenari reali. I nuovi clienti ricevono anche 300 $ di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.

Prova Cloud Storage gratuitamente