Mude o nome e mova pastas

Esta página descreve como mudar o nome e mover pastas num contentor com o espaço de nomes hierárquico ativado.

A operação de mudança de nome muda recursivamente o nome de uma pasta, das respetivas subpastas e dos recursos associados, incluindo objetos e pastas geridas, numa única ação atómica.

A operação de mudança de nome é atómica. A operação é concluída com êxito e move os recursos para o novo caminho ou falha com um erro. Em caso de erro, todos os recursos são restaurados para o respetivo estado original.

Num contentor com o espaço de nomes hierárquico ativado, mudar o nome de uma pasta é uma operação apenas de metadados. Não envolve a movimentação nem a cópia física dos objetos na pasta, pelo que não são incorridos custos de cópia de objetos.

No entanto, numa contentor sem o espaço de nomes hierárquico ativado, as pastas são simuladas. A mudança do nome ou a movimentação de uma pasta simulada requer a cópia e a eliminação de cada objeto na mesma. Se a pasta contiver muitos objetos, o processo de mudança de nome pode ser ineficiente e dispendioso. A mudança do nome ou a movimentação de uma pasta simulada também não é atómica, o que significa que, se o processo falhar, o seu contentor pode ficar num estado inconsistente, com apenas alguns objetos movidos.

Durante o processo de mudança do nome da pasta, pode ler e listar os recursos cujo nome está a ser mudado. No entanto, não pode executar operações de escrita nos recursos afetados.

A operação de mudança do nome da pasta inicia uma operação de longa duração num contentor.

Antes de começar

Certifique-se de que o seu contentor tem o espaço de nomes hierárquico ativado. Para obter instruções detalhadas sobre como ativar o espaço de nomes hierárquico num contentor, consulte o artigo Crie contentores com o espaço de nomes hierárquico ativado.

Funções necessárias

Para receber as autorizações necessárias para mudar o nome ou mover pastas em contentores, peça ao seu administrador para lhe conceder a função de IAM de utilizador de objetos de armazenamento (roles/storage.objectUser) no contentor.

Para mais informações sobre a concessão de funções em projetos, consulte o artigo Faça a gestão do acesso a projetos.

Para ver as autorizações exatas necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

  • storage.folders.rename
    • Esta autorização é necessária na pasta de origem.
  • storage.folders.create
    • Esta autorização é necessária na pasta de destino.

Também pode obter as autorizações anteriores com outras funções personalizadas ou funções predefinidas. Para uma função mais permissiva que lhe permita gerir pastas, além de mudar o nome das pastas, peça ao seu administrador para lhe conceder uma das seguintes funções:

  • Administrador da pasta de armazenamento (roles/storage.folderAdmin)
  • Administrador de objetos de armazenamento (roles/storage.objectAdmin)
  • Administrador de armazenamento (roles/storage.admin)

Para ver as funções associadas a cada autorização, consulte o artigo Funções de IAM para o Cloud Storage.

Mude o nome e mova uma pasta

Consola

  1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

    Aceda a Recipientes

  2. Na lista de contentores, clique no nome do contentor que contém a pasta que quer mover ou mudar o nome.

  3. Na página Detalhes do contentor, encontre a pasta que quer mover ou mudar o nome.

  4. Se quiser mudar o nome da pasta, faça o seguinte:

    1. Clique no menu Mais ações da pasta.

    2. Clique em Mudar o nome da pasta.

    3. Na janela de sobreposição apresentada, introduza um novo nome para a pasta.

    4. Clique em Mudar o nome.

  5. Se quiser mover a pasta para uma pasta diferente, faça o seguinte:

    1. Clique no menu Mais ações da pasta.

    2. Clique em Mover pasta.

    3. Na janela de sobreposição apresentada, clique em Procurar.

    4. Selecione a pasta de destino para a pasta que está a mover. Também pode clicar em para criar uma nova pasta antes de a selecionar como pasta de destino.

    5. Clique em Selecionar.

    6. Clique em Mover.

Para saber como obter informações detalhadas sobre erros relativos a operações do Cloud Storage falhadas na Google Cloud consola, consulte a secção Resolução de problemas.

Linha de comandos

Para mudar o nome ou mover pastas num contentor com espaço de nomes hierárquico, execute o comando gcloud storage mv:

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

Onde:

  • BUCKET_NAME é o nome do contentor que contém a pasta à qual quer mudar o nome ou que quer mover. Por exemplo, my-bucket.
  • FOLDER1 é o nome da pasta original à qual quer mudar o nome ou que quer mover. Por exemplo, my-src-folder.
  • FOLDER2 é o novo nome da pasta de destino. Por exemplo, my-dest-folder. Se o novo nome que escolher já estiver a ser usado por uma pasta existente, a pasta original é movida para dentro da pasta existente, tornando-se uma pasta secundária. Por exemplo, se mudar o nome de my-dest-folder para my-dest-folder1 (e my-dest-folder1 já existir), o resultado é my-dest-folder1/my-dest-folder/. Se o novo nome que escolher ainda não existir, o nome da pasta original é alterado para corresponder ao novo nome.

A resposta tem o seguinte aspeto:

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

Bibliotecas cliente

C++

Para mais informações, consulte a documentação de referência da API C++ do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API C# do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API Go do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API Java do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API Node.js do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API PHP do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API Python do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API Ruby do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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. Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho Authorization.

  2. Use cURL para chamar a API JSON com um pedido para mudar o nome das pastas:

    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"

    Onde:

    • BUCKET_NAME é o nome do contentor que contém a pasta à qual quer mudar o nome ou que quer mover. Por exemplo, my-bucket.
    • SOURCE_PATH é o caminho codificado por URL da pasta de origem. Por exemplo, my-src-folder/ é codificado em URL como my-src-folder%2F.
    • DESTINATION_PATH é o caminho codificado por URL da pasta de destino. Por exemplo, my-dest-folder/ é codificado em URL como my-dest-folder%2F.

Passos seguintes

Experimente

Se está a usar o Google Cloud pela primeira vez, crie uma conta para avaliar o desempenho do Cloud Storage em cenários reais. Os novos clientes também recebem 300 USD em créditos gratuitos para executar, testar e implementar cargas de trabalho.

Experimentar o Cloud Storage gratuitamente