重命名文件以满足命名规范

更新时间:2025-02-11 02:28:03

OSS数据迁移或重组过程中,您可以通过重命名文件满足新的组织标准,确保命名一致性和结构准确性。

使用场景

  • 命名规范实施:在实施新的文件命名规范以提高数据管理效率和一致性时,需要重命名现有的对象以符合这些规范。

  • 数据迁移和重组:在组织架构调整、系统迁移或应用程序升级时,可能需要移动或重组存储在OSS中的数据,这通常伴随着对象的重命名。

  • 存储布局优化:为了改善数据检索性能和组织结构,有时需要重命名对象以反映更优化的存储布局和虚拟目录结构。

注意事项

  • Object一旦被创建,其内容和名称便不可更改。因此,与传统的文件系统不同,在OSS中不能直接通过修改对象的名称来实现文件的重命名。在同一个Bucket内对Object进行重命名操作,实际上是通过CopyObject接口将源Object拷贝至目标Object,然后通过DeleteObject接口删除源Object来实现的。

  • 如果重命名Object操作涉及的Object类型为低频、归档、冷归档、或者深度冷归档存储类型且存储未满规定时长,则会产生存储不足规定时长容量费用。更多详情,请参见存储费用

  • 对于已开启版本控制Bucket,仅在历史版本设为隐藏后才允许执行重命名操作。将Object重命名后,原有的Object会增加删除标记。

  • 在批量重命名文件时,先列出所有待更改的文件名称,逐个进行复制并验证新文件是否正确生成,确认无误后再删除原文件,以此确保数据的完整性和安全。

  • 为避免影响OSS-HDFS服务的正常使用或者引发数据丢失的风险,在开通了OSS-HDFS服务的Bucket中,禁止重命名OSS-HDFS的数据存储目录.dlsdata/下的任意Object。

操作步骤

使用OSS控制台

OSS控制台不支持重命名1 GB以上的Object。如需重命名1GB以上的Object,请使用SDK、ossutil、REST API。

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择文件管理 > 文件列表,将鼠标指针悬停在目标Object上,然后单击图标edit,对Object进行重命名。重命名时,Object名称需包含后缀。

使用阿里云SDK

例如,将examplebucket中的srcobject.txt重命名为destobject.txt。配置示例如下:

Java
PHP
Node.js
Python
Android-Java
Object C
Go
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称。
        String bucketName = "examplebucket";
        // 填写源Object的完整路径,完整路径中不能包含Bucket名称。
        String sourceKey = "srcobject.txt";
        // 填写目标Object的完整路径。Object完整路径中不能包含Bucket名称。
        String destinationKey = "destobject.txt";
        // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
        String region = "cn-hangzhou";

        // 创建OSSClient实例。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            // 将examplebucket下的srcobject.txt拷贝至同一Bucket下的destobject.txt。
            ossClient.copyObject(bucketName, sourceKey, bucketName, destinationKey);

            // 删除srcobject.txt。
            ossClient.deleteObject(bucketName, sourceKey);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
$fromObject = "srcobject.txt";
// 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
$toObject = 'destobject.txt';

try {
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
    // 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
    $ossClient->copyObject($bucket, $fromObject,$bucket, $toObject);
    // 删除srcobject.txt。
    $ossClient->deleteObject($bucket, $fromObject);
} catch (OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}
print("Object ".$fromObject ." Rename complete" . PHP_EOL);
const OSS = require('ali-oss');
const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'oss-cn-hangzhou',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // 填写Bucket名称。
  bucket: 'examplebucket',
})

async function renameObject() {
  try {
    // 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
    const r = await client.copy('destobject.txt', 'srcobject.txt');
    console.log('拷贝成功', r);
    // 删除srcobject.txt。
    const deleteResult = await client.delete('srcobject.txt');
    console.log(deleteResult);
  } catch (e) {
    console.log(e);
  }
}

renameObject();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"

# 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
region = "cn-hangzhou"

# examplebucket填写存储空间名称。
bucket_name = 'examplebucket'
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

# 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
src_object_name = 'srcobject.txt'
# 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
dest_object_name = 'destobject.txt'

# 将examplebucket下的srcobject.txt拷贝至同一Bucket下的destobject.txt。
result = bucket.copy_object(bucket_name, src_object_name, dest_object_name)

# 查看返回结果的状态。如果返回值为200,表示执行成功。
print('result.status:', result.status)

# 删除srcobject.txt。
result_del = bucket.delete_object(src_object_name)

# 查看返回结果的状态。如果返回值为204,表示执行成功。
print('result.status:', result_del.status)
// 填写Bucket名称。
String bucketName = "examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
String sourceObjectKey = "srcobject.txt";
// 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
String objectKey = "destobject.txt";
try {
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucketName, sourceObjectKey, bucketName, objectKey);
    oss.copyObject(copyObjectRequest);
    // 删除srcobject.txt。
    DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, sourceObjectKey);
    oss.deleteObject(deleteObjectRequest);
} catch (ClientException e) {
    // 客户端异常,例如网络异常等。
    e.printStackTrace();
} catch (ServiceException e) {
    // 服务端异常。
    Log.e("RequestId", e.getRequestId());
    Log.e("ErrorCode", e.getErrorCode());
    Log.e("HostId", e.getHostId());
    Log.e("RawMessage", e.getRawMessage());
}
// 填写Bucket名称。
NSString *bucketName = @"examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如srcobject.txt。
NSString *sourceObjectKey = @"sourceObjectKey";
// 填写不包含Bucket名称在内目标Object的完整路径,例如destobject.txt。
NSString *objectKey = @"destobject.txt";
[[[OSSTask taskWithResult:nil] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    // 将srcobject.txt拷贝至同一Bucket下的destobject.txt。
    OSSCopyObjectRequest *copyRequest = [OSSCopyObjectRequest new];
    copyRequest.bucketName = bucketName;
    copyRequest.sourceBucketName = bucketName;
    copyRequest.sourceObjectKey = sourceObjectKey;
    copyRequest.objectKey = objectKey;
    OSSTask *copyTask = [client copyObject:copyRequest];
    [copyTask waitUntilFinished];
    if (copyTask.error) {
        return copyTask;
    }
    // 删除srcobject.txt。
    OSSDeleteObjectRequest *deleteObject = [OSSDeleteObjectRequest new];
    deleteObject.bucketName = bucketName;
    deleteObject.objectKey = sourceObjectKey;
    OSSTask *deleteTask = [client deleteObject:deleteObject];
    [deleteTask waitUntilFinished];
    if (deleteTask.error) {
        return deleteTask;
    }
    return nil;
}] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (task.error) {
        NSLog(@"rename fail! error: %@", task.error);
    } else {
        NSLog(@"rename success!");
    }
    return nil;
}];
package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region         string // 存储区域
	srcBucketName  string // 源存储空间名称
	srcObjectName  string // 源对象名称
	destBucketName string // 目标存储空间名称
	destObjectName string // 目标对象名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
	flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
	flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查源bucket名称是否为空
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 如果目标bucket名称未指定,则使用源bucket名称
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// 检查源object名称是否为空
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// 检查目标object名称是否为空
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建复制对象请求
	copyRequest := &oss.CopyObjectRequest{
		Bucket:       oss.Ptr(destBucketName),  // 目标存储空间名称
		Key:          oss.Ptr(destObjectName),  // 目标对象名称
		SourceKey:    oss.Ptr(srcObjectName),   // 源对象名称
		SourceBucket: oss.Ptr(srcBucketName),   // 源存储空间名称
		StorageClass: oss.StorageClassStandard, // 设置存储类型为标准类型
	}

	// 执行复制对象操作并处理结果
	copyResult, err := client.CopyObject(context.TODO(), copyRequest)
	if err != nil {
		log.Fatalf("failed to copy object: %v", err)
	}

	// 构建删除对象的请求
	deleteRequest := &oss.DeleteObjectRequest{
		Bucket: oss.Ptr(srcBucketName), // 存储空间名称
		Key:    oss.Ptr(srcObjectName), // 要删除的对象名称
	}

	// 执行删除对象的操作
	deleteResult, err := client.DeleteObject(context.TODO(), deleteRequest)
	if err != nil {
		log.Fatalf("failed to delete multiple objects %v", err)
	}

	// 打印拷贝对象的结果
	log.Printf("copy object result:%#v\n", copyResult)
	// 打印删除对象的结果
	log.Printf("delete objects result:%#v\n", deleteResult)
}

关于其他SDK的重命名Object的代码示例,请参见SDK简介

使用图形化管理工具ossbrowser

ossbrowser支持Bucket级别的操作与控制台支持的操作类似,请按照ossbrowser界面指引完成重命名文件的操作。关于如何使用ossbrowser,请参见ossbrowser 2.0常用操作

使用命令行工具ossutil

例如,将examplebucket中的srcobject.txt重命名为destobject.txt。配置示例如下:

ossutil cp oss://examplebucket/srcobject.txt oss://examplebucket/destobject.txt
ossutil rm oss://examplebucket/srcobject.txt

关于使用ossutil重命名Object的具体步骤,请参见cp(拷贝文件)rm(删除)

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见CopyObjectDeleteObject

相关文档

  • 如果要在下载文件时重命名文件,建议您通过预签名URL或文件元数据来实现,而不是直接重命名文件。因为通过复制和删除操作来重命名文件,不仅会造成额外的费用,还可能会导致依赖于原始文件名的应用程序出现错误。具体操作,请参见设置OSS文件下载时的文件名

  • 如何重命名目录(文件夹),请参见重命名目录

  • 本页导读 (1)
  • 使用场景
  • 注意事项
  • 操作步骤
  • 使用OSS控制台
  • 使用阿里云SDK
  • 使用图形化管理工具ossbrowser
  • 使用命令行工具ossutil
  • 使用REST API
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等