您可以通过cp命令将您OSS内文件拷贝至其他目录或其他Bucket中。目前只支持拷贝文件,不支持拷贝未完成的Multipart,不支持跨region拷贝。

说明 cp命令的格式、支持的参数请参见 简介

示例环境

本文以Linux系统为例,演示如何在不同目录或不同Bucket之间拷贝文件。您在实际使用中,请根据您的系统和使用环境修改对应参数。示例环境如下:

  • 操作系统:Linux
  • 源Bucket:examplebucket1
  • 源Bucket指定目录1:srcfolder1
  • 源Bucket指定目录2:srcfolder2
  • 源文件:examplefile.txt
  • 目标Bucket:examplebucket2
  • 目标Bucket指定目录:desfolder

简单拷贝示例

  • 拷贝单个文件
    ./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket1/srcfolder2/                                 
  • 拷贝文件夹
    拷贝文件时,搭配 -r 选项可以实现批量文件拷贝功能。
    ./ossutil cp oss://examplebucket1/srcfolder1/ oss://examplebucket2/desfolder/ -r                                   
  • 拷贝增量文件
    批量拷贝时,若指定 --update选项,只有当目标文件不存在,或源文件的最后修改时间晚于目标文件时,ossutil才会执行拷贝操作。命令如下:
    ./ossutil cp oss://examplebucket1/srcfolder1/ oss://examplebucket2/path2/ -r --update
    该选项可用于当批量拷贝失败重传时,跳过已经拷贝成功的文件,实现增量拷贝。
  • 重命名文件
    ./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket1/example.txt                        
    通过cp命令重命名文件时,原文件仍存在,您可以在重命名后删除原文件。
  • 仅拷贝当前目录下的文件,忽略子目录
    ./ossutil cp oss://examplebucket1/srcfolder1/ oss://examplebucket1/srcfolder2/ --only-current-dir -r
  • 修改文件meta信息
    拷贝文件的同时可以使用 --meta选项修改文件的meta信息,其内容格式为 header:value#header:value...
    ./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket1/ --meta=Cache-Control:no-cache
  • 从开通了请求者付费模式的Bucket拷贝文件到普通Bucket
    ./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket2/desfolder/  --payer=requester

修改文件存储类型

您可以在覆写文件时,添加 --meta选项来修改文件存储类型。存储类型可选值为:
  • Standard:标准存储
  • IA:低频访问
  • Archive:归档存储
更多详情请参见 存储类型介绍。命令如下:
  • 将指定文件的存储类型修改归档存储
    ./ossutil cp oss://examplebucket1/srcfolder1/examplefile.txt oss://examplebucket1/srcfolder1/examplefile.txt --meta X-oss-Storage-Class:Archive
  • 将指定文件夹下所有文件的存储类型修改为标准存储
    ./ossutil cp oss://examplebucket1/srcfolder1/ oss://examplebucket1/srcfolder1/ --meta X-oss-Storage-Class:Standard -r
    注意
    • 存储类型为归档和冷归档的文件不能通过cp命令直接转换成其他类型,必须先通过restore命令将该文件解冻,之后再使用cp命令转换文件类型。
    • 使用cp覆写文件时涉及到数据覆盖操作。如果低频访问、归档、冷归档类型文件在最低存储期内被覆盖,会产生提前删除费用。详情请参见存储费用

修改文件对象标签

您可以在覆写文件时,添加 --tagging选项修改文件对象标签,多个标签以and(&)符号隔开。命令如下:
./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket1/ --tagging "abc=1&bcd=2&……"

关于对象标签的更多说明请参见object-tagging

拷贝并加密文件

您可以在拷贝文件时指定文件的服务器端加密方式,将文件加密后保存在Bucket内,关于服务器端加密功能介绍请参见 服务器端加密
  • 拷贝文件并指定加密方式为AES256
    ./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket1/srcfolder2/ --meta=x-oss-server-side-encryption:AES256
  • 拷贝文件并指定加密方式为KMS
    ./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket2/desfolder/ --meta=x-oss-server-side-encryption:KMS
    注意 使用KMS加密时,OSS会在KMS平台上为这个文件创建一个主密钥,会产生少量KMS密钥API调用费用,详情请参见 KMS计费标准

在已开启版本控制的Bucket内恢复文件

开启Bucket的版本控制后,针对数据的覆盖和删除操作将会以历史版本的形式保存下来。您可以在 cp命令中增加 --version-id选项,将历史版本覆写为最新版本。命令如下:
./ossutil cp oss://examplebucket1/examplefile.txt oss://examplebucket2/ --version-id  CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3MDRk
注意
  • 使用--version-id选项前,需使用ls --all-versions命令获取文件的versionid。
  • --version-id选项仅支持在已开启版本控制的Bucket内使用。开启Bucket版本控制命令请参见bucket-versioning

批量拷贝符合指定条件的文件

您可以使用 --include--exclude参数,在拷贝时选定符合条件的文件。详情请参见 批量上传符合条件的文件
  • 拷贝所有文件格式不为JPG的文件
    ./ossutil cp oss://examplebucket1/srcfolder1/ oss://examplebucket2/desfolder/ --exclude "*.jpg" -r
  • 拷贝所有文件名包含abc且不是JPGTXT格式的文件
    ./ossutil cp oss://examplebucket1/srcfolder1/ oss://examplebucket2/desfolder/ --include "*abc*" --exclude "*.jpg" --exclude "*.txt" -r