שינוי השם של תיקיות והעברה שלהן

בדף הזה מוסבר איך לשנות את השם של תיקיות ולהעביר אותן בקטגוריה שבה מופעל מרחב שמות היררכי.

פעולת שינוי השם משנה באופן רקורסיבי את השם של תיקייה, של תיקיות הצאצא שלה ושל משאבים משויכים, כולל אובייקטים ותיקיות מנוהלות, בפעולה אטומית אחת.

פעולת שינוי השם היא אטומית. הפעולה מסתיימת בהצלחה והמשאבים מועברים לנתיב החדש שלהם, או שהיא נכשלת ומוחזרת שגיאה. במקרה של שגיאה, כל המשאבים משוחזרים למצב המקורי שלהם.

בקטגוריה שמופעל בה מרחב שמות היררכי, שינוי השם של תיקייה הוא פעולה שמתבצעת רק במטא-נתונים. הפעולה לא כוללת העברה פיזית או העתקה של האובייקטים בתיקייה, ולכן לא חלות עלויות על העתקת אובייקטים.

עם זאת, בקטגוריה שבה לא מופעל מרחב שמות היררכי, התיקיות מדוּמות. כדי לשנות את השם של תיקייה מדומה או להעביר אותה, צריך להעתיק כל אובייקט בתוכה ואז למחוק אותו. אם התיקייה מכילה הרבה אובייקטים, תהליך שינוי השם עלול להיות לא יעיל ויקר. גם שינוי השם או ההעברה של תיקייה מדומה הם לא אטומיים, כלומר אם התהליך ייכשל, יכול להיות שהקטגוריה תישאר במצב לא עקבי, ורק חלק מהאובייקטים יועברו.

במהלך תהליך שינוי השם של התיקייה, אפשר לקרוא את המשאבים שמשנים את השם שלהם ולראות אותם ברשימה. עם זאת, אי אפשר להריץ פעולות כתיבה במקורות המידע המושפעים.

הפעולה של שינוי שם התיקייה מפעילה פעולה ממושכת בדלי.

לפני שמתחילים

מוודאים שהאפשרות 'מרחב שמות היררכי' מופעלת בדלי. הוראות מפורטות להפעלת מרחב שמות היררכי בקטגוריה זמינות במאמר יצירת קטגוריות עם מרחב שמות היררכי מופעל.

התפקידים הנדרשים

כדי לקבל את ההרשאות הנדרשות לשינוי השם של תיקיות בקטגוריות או להעברתן, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM 'משתמש באובייקטים באחסון' (roles/storage.objectUser) בקטגוריה.

מידע נוסף על הקצאת תפקידים בפרויקטים מופיע במאמר ניהול הגישה לפרויקטים.

כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

  • storage.folders.rename
    • ההרשאה הזו נדרשת בתיקיית המקור.
  • storage.folders.create
    • ההרשאה הזו נדרשת בתיקיית היעד.

אפשר לקבל את ההרשאות שצוינו למעלה גם באמצעות תפקידים אחרים בהתאמה אישית או תפקידים מוגדרים מראש. כדי לקבל תפקיד עם יותר הרשאות שמאפשר לכם לנהל תיקיות בנוסף לשינוי השם שלהן, אתם צריכים לבקש מהאדמין להקצות לכם אחד מהתפקידים הבאים:

  • אדמין תיקיות אחסון (roles/storage.folderAdmin)
  • אדמין של אובייקטים באחסון (roles/storage.objectAdmin)
  • אדמין לניהול נפח האחסון (roles/storage.admin)

במאמר תפקידי IAM ל-Cloud Storage מפורטים התפקידים השונים וההרשאות שמשויכות אליהם.

שינוי שם של תיקייה והעברה שלה

המסוף

  1. במסוף Google Cloud , נכנסים לדף Buckets של Cloud Storage.

    כניסה לדף Buckets

  2. ברשימת הקטגוריות, לוחצים על שם הקטגוריה שמכילה את התיקייה שרוצים להעביר או לשנות לה את השם.

  3. בדף פרטי הקטגוריה, מאתרים את התיקייה שרוצים להעביר או לשנות לה את השם.

  4. כדי לשנות את שם התיקייה:

    1. לוחצים על התפריט פעולות נוספות של התיקייה.

    2. לוחצים על שינוי שם התיקייה.

    3. בחלון שכבת-העל שמופיע, מזינים שם חדש לתיקייה.

    4. לוחצים על שינוי שם.

  5. כדי להעביר את התיקייה לתיקייה אחרת:

    1. לוחצים על התפריט פעולות נוספות של התיקייה.

    2. לוחצים על העברת התיקייה.

    3. בחלון שכבת-העל שמופיע, לוחצים על Browse.

    4. בוחרים את תיקיית היעד שאליה רוצים להעביר את התיקייה. אפשר גם ללחוץ על כדי ליצור תיקייה חדשה לפני שבוחרים אותה כתיקיית היעד.

    5. לוחצים על בחירה.

    6. לוחצים על Move.

במאמר פתרון בעיות מוסבר איך מקבלים מידע מפורט על שגיאות בנושא פעולות ב-Cloud Storage שנכשלו במסוף Google Cloud .

שורת הפקודה

כדי לשנות את השם של תיקיות בתוך קטגוריה עם מרחב שמות היררכי או להעביר אותן, מריצים את הפקודה gcloud storage mv:

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

כאשר:

  • BUCKET_NAME הוא שם הקטגוריה שמכילה את התיקייה שרוצים לשנות לה את השם או להעביר אותה. לדוגמה, my-bucket.
  • FOLDER1 הוא השם של התיקייה המקורית שרוצים לשנות את השם שלה או להעביר אותה. לדוגמה, my-src-folder.
  • FOLDER2 הוא השם החדש של תיקיית היעד. לדוגמה, my-dest-folder. אם השם החדש שבחרתם כבר נמצא בשימוש של תיקייה קיימת, התיקייה המקורית תועבר לתוך התיקייה הקיימת ותהפוך לתיקיית צאצא. לדוגמה, אם משנים את השם של my-dest-folder ל-my-dest-folder1 (ו-my-dest-folder1 כבר קיים), התוצאה היא my-dest-folder1/my-dest-folder/. אם השם החדש שבחרתם עדיין לא קיים, השם של התיקייה המקורית ישתנה לשם החדש.

התגובה אמורה להיות דומה לדוגמה הבאה:

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

ספריות לקוח

C++

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage C++ API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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#

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage C# API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Go API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Java API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.


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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Node.js API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage PHP API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Python API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Ruby API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

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. התקנה והפעלה של ה-CLI של gcloud, שמאפשרות ליצור אסימון גישה לכותרת Authorization.

  2. משתמשים ב- cURL כדי לשלוח קריאה ל-API בפורמט JSON באמצעות בקשה לשינוי שם של תיקיות:

    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"

    כאשר:

    • BUCKET_NAME הוא שם הקטגוריה שמכילה את התיקייה שרוצים לשנות לה את השם או להעביר אותה. לדוגמה, my-bucket.
    • SOURCE_PATH הוא הנתיב של תיקיית המקור בקידוד כתובת URL. לדוגמה, my-src-folder/ יותאם לקידודי התווים שמתאימים לכתובות URL באופן הבא: my-src-folder%2F.
    • DESTINATION_PATH הוא הנתיב של תיקיית היעד עם קידוד כתובת URL. לדוגמה, my-dest-folder/ יותאם לקידודי התווים שמתאימים לכתובות URL באופן הבא: my-dest-folder%2F.

השלבים הבאים

נסו בעצמכם

אנחנו ממליצים למשתמשים חדשים ב-Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של Cloud Storage בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300 $להרצה, לבדיקה ולפריסה של עומסי העבודה.

להתנסות ב-Cloud Storage בחינם