Rinominare e spostare cartelle

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

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

L'operazione di ridenominazione è atomica. L'operazione viene completata correttamente e le risorse vengono spostate nel nuovo percorso oppure non viene completata e viene visualizzato un errore. In caso di errore, tutte le risorse vengono ripristinate allo stato originale.

In un bucket con uno spazio dei nomi gerarchico abilitato, la ridenominazione di una cartella è un'operazione limitata ai metadati. Non comporta lo spostamento o la copia fisica degli oggetti all'interno della cartella, pertanto non vengono sostenuti costi di copia degli oggetti.

Tuttavia, in un bucket senza spazio dei nomi gerarchico abilitato, le cartelle vengono simulate. 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, la procedura di rinominazione può essere inefficiente e dispendiosa. Anche la ridenominazione o lo spostamento di una cartella simulata non è atomica, il che significa che se la procedura non va a buon fine, il bucket potrebbe rimanere in uno stato incoerente, con solo alcuni oggetti spostati.

Durante la procedura di rinominazione della cartella, puoi leggere e 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 o spostare le cartelle nei bucket, chiedi all'amministratore di concederti il ruolo IAM Utente oggetto archiviazione (roles/storage.objectUser) nel bucket.

Per saperne di più sulla concessione dei ruoli nei progetti, consulta Gestire l'accesso ai progetti.

Per visualizzare le autorizzazioni esatte richieste, espandi la sezione Autorizzazioni richieste:

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 ti consenta di gestire le cartelle oltre a rinominarle, chiedi all'amministratore di concederti uno dei seguenti ruoli:

  • Storage Folder Admin (roles/storage.folderAdmin)
  • Storage Object Admin (roles/storage.objectAdmin)
  • Amministratore Storage (roles/storage.admin)

Per sapere quali ruoli sono associati a quali autorizzazioni, consulta la sezione Ruoli IAM per Cloud Storage.

Rinominare e spostare una cartella

Console

  1. Nella console Google Cloud, vai alla pagina Bucket in Cloud Storage.

    Vai a Bucket

  2. Nell'elenco dei bucket, fai clic sul nome del bucket contenente la cartella che vuoi spostare o rinominare.

  3. Nella pagina Dettagli bucket, individua la cartella che vuoi spostare o rinominare.

  4. Se vuoi rinominare la cartella:

    1. Fai clic sul menu Altre azioni della cartella.

    2. Fai clic su Rinomina cartella.

    3. Nella finestra in overlay visualizzata, inserisci un nuovo nome per la cartella.

    4. Fai clic su Rinomina.

  5. Se vuoi spostare la cartella in un'altra cartella:

    1. Fai clic sul menu Altre azioni della cartella.

    2. Fai clic su Sposta cartella.

    3. Nella finestra di overlay visualizzata, fai clic su Sfoglia.

    4. Seleziona la cartella di destinazione per la cartella che stai spostando. Puoi anche fare clic su per creare una nuova cartella prima di selezionarla come cartella di destinazione.

    5. Fai clic su Seleziona.

    6. Fai clic su Sposta.

Per scoprire come ottenere informazioni dettagliate sugli errori relativi alle operazioni di Cloud Storage non riuscite nella console Google Cloud, consulta la sezione Risoluzione dei problemi.

Riga di comando

Per rinominare o spostare 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 contenente la cartella che vuoi rinominare o spostare. Ad esempio, my-bucket.
  • FOLDER1 è il nome della cartella originale che vuoi rinominare o spostare. Ad esempio, my-src-folder.
  • FOLDER2 è il nuovo nome della cartella di destinazione. Ad esempio, my-dest-folder. Se il nuovo nome scelto è già utilizzato da una cartella esistente, la cartella originale viene spostata all'interno della cartella esistente e diventa 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 la documentazione di riferimento dell'API Cloud Storage C++.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare 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 la documentazione di riferimento dell'API Cloud Storage Go.

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 saperne di più, consulta la documentazione di riferimento dell'API Cloud Storage Java.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare 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 autenticarti a Cloud Storage, configura le 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 = 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

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

Per autenticarti a Cloud Storage, configura le 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 la documentazione di riferimento dell'API Cloud Storage Python.

Per autenticarti a Cloud Storage, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare 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 la documentazione di riferimento dell'API Cloud Storage Ruby.

Per autenticarti a Cloud Storage, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare 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, che consente generi un token di accesso per l'intestazione Authorization.

  2. Utilizza cURL per chiamare l'API JSON con una richiesta di rinominazione delle 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 o spostare. 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 codificato dell'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