Cambiar el nombre y mover carpetas

En esta página se describe cómo cambiar el nombre y mover carpetas en un contenedor con el espacio de nombres jerárquico habilitado.

La operación de cambio de nombre cambia de forma recursiva el nombre de una carpeta, sus subcarpetas y los recursos asociados, incluidos los objetos y las carpetas gestionadas, en una sola acción atómica.

La operación de cambio de nombre es atómica. La operación se completa correctamente y los recursos se mueven a su nueva ruta, o bien se produce un error. En caso de error, todos los recursos se restauran a su estado original.

En un contenedor con el espacio de nombres jerárquico habilitado, cambiar el nombre de una carpeta es una operación que solo afecta a los metadatos. No implica mover ni copiar físicamente los objetos de la carpeta, por lo que no se incurre en ningún coste de copia de objetos.

Sin embargo, en un segmento sin el espacio de nombres jerárquico habilitado, las carpetas se simulan. Para cambiar el nombre o mover una carpeta simulada, debes copiar y eliminar cada objeto que contenga. Si tu carpeta contiene muchos objetos, el proceso de cambio de nombre puede ser ineficiente y costoso. Cambiar el nombre o mover una carpeta simulada tampoco es atómico, lo que significa que, si el proceso falla, el contenedor puede quedar en un estado incoherente, con solo algunos objetos movidos.

Durante el proceso de cambio de nombre de la carpeta, puedes leer y enumerar los recursos cuyo nombre se va a cambiar. Sin embargo, no puedes ejecutar operaciones de escritura en los recursos afectados.

La operación de cambio de nombre de la carpeta inicia una operación de larga duración en un cubo.

Antes de empezar

Asegúrate de que el espacio de nombres jerárquico esté habilitado en tu segmento. Para obtener instrucciones detalladas sobre cómo habilitar el espacio de nombres jerárquico en un segmento, consulta Crear segmentos con el espacio de nombres jerárquico habilitado.

Roles obligatorios

Para obtener los permisos necesarios para cambiar el nombre o mover carpetas en los segmentos, pide a tu administrador que te conceda el rol de gestión de identidades y accesos de usuario de objetos de almacenamiento (roles/storage.objectUser) en el segmento.

Para obtener más información sobre cómo conceder roles en proyectos, consulta el artículo Gestionar el acceso a proyectos.

Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

  • storage.folders.rename
    • Este permiso es necesario en la carpeta de origen.
  • storage.folders.create
    • Este permiso es necesario en la carpeta de destino.

También puedes obtener los permisos anteriores con otros roles personalizados o roles predefinidos. Si quieres tener un rol con más permisos que te permita gestionar carpetas además de cambiarles el nombre, pide a tu administrador que te asigne uno de los siguientes roles:

  • Administrador de carpetas de almacenamiento (roles/storage.folderAdmin)
  • Administrador de objetos de Storage (roles/storage.objectAdmin)
  • Administrador de almacenamiento (roles/storage.admin)

Para ver qué roles están asociados a qué permisos, consulta Roles de gestión de identidades y accesos para Cloud Storage.

Cambiar el nombre y mover una carpeta

Consola

  1. En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.

    Ir a Contenedores

  2. En la lista de segmentos, haga clic en el nombre del segmento que contiene la carpeta que quiere mover o cambiar de nombre.

  3. En la página Detalles del segmento, busca la carpeta que quieras mover o cambiar de nombre.

  4. Si quieres cambiar el nombre de la carpeta, sigue estos pasos:

    1. Haz clic en el menú Más acciones de la carpeta.

    2. Haz clic en Cambiar nombre de la carpeta.

    3. En la ventana superpuesta que aparece, escribe un nuevo nombre para la carpeta.

    4. Haz clic en Cambiar nombre.

  5. Si quieres mover la carpeta a otra, haz lo siguiente:

    1. Haz clic en el menú Más acciones de la carpeta.

    2. Haz clic en Mover carpeta.

    3. En la ventana superpuesta que aparece, haz clic en Buscar.

    4. Selecciona la carpeta de destino de la carpeta que vas a mover. También puedes hacer clic en para crear una carpeta antes de seleccionarla como carpeta de destino.

    5. Haz clic en Seleccionar.

    6. Haz clic en Mover.

Para saber cómo obtener información detallada sobre los errores de las operaciones de Cloud Storage en la consola, consulta la sección Solución de problemas. Google Cloud

Línea de comandos

Para cambiar el nombre o mover carpetas dentro de un contenedor con un espacio de nombres jerárquico, ejecuta el comando gcloud storage mv:

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

Donde:

  • BUCKET_NAME es el nombre del segmento que contiene la carpeta a la que quieres cambiar el nombre o mover. Por ejemplo, my-bucket.
  • FOLDER1 es el nombre de la carpeta original a la que quieres cambiar el nombre o mover. Por ejemplo, my-src-folder.
  • FOLDER2 es el nuevo nombre de la carpeta de destino. Por ejemplo, my-dest-folder. Si el nuevo nombre que elijas ya lo usa otra carpeta, la carpeta original se moverá a la carpeta que ya existía y se convertirá en una subcarpeta. Por ejemplo, si cambias el nombre de my-dest-folder a my-dest-folder1 (y my-dest-folder1 ya existe), el resultado es my-dest-folder1/my-dest-folder/. Si el nuevo nombre que elijas no existe, se cambiará el nombre de la carpeta original por el nuevo.

La respuesta tiene este aspecto:

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

Bibliotecas de cliente

C++

Para obtener más información, consulta la documentación de referencia de la API C++ de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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#

Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Para obtener más información, consulta la documentación de referencia de la API Java de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.


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

Para obtener más información, consulta la documentación de referencia de la API Node.js de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Para obtener más información, consulta la documentación de referencia de la API PHP de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Para obtener más información, consulta la documentación de referencia de la API Python de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Para obtener más información, consulta la documentación de referencia de la API Ruby de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

APIs REST

API JSON

  1. Tener instalada e inicializadala CLI de gcloud, que te permite generar un token de acceso para el encabezado Authorization.

  2. Usa cURL para llamar a la API JSON con una solicitud para cambiar el nombre de las carpetas:

    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"

    Donde:

    • BUCKET_NAME es el nombre del segmento que contiene la carpeta cuyo nombre quieres cambiar o que quieres mover. Por ejemplo, my-bucket.
    • SOURCE_PATH es la ruta codificada como URL de la carpeta de origen. Por ejemplo, my-src-folder/ codificado como URL es my-src-folder%2F.
    • DESTINATION_PATH es la ruta codificada mediante URL de la carpeta de destino. Por ejemplo, my-dest-folder/ codificado como URL es my-dest-folder%2F.

Pasos siguientes

Pruébalo

Si es la primera vez que utilizas Google Cloud, crea una cuenta para evaluar el rendimiento de Cloud Storage en situaciones reales. Los nuevos clientes también reciben 300 USD en crédito gratuito para ejecutar, probar y desplegar cargas de trabajo.

Probar Cloud Storage gratis