# tccli cos 插件使用文档

腾讯云 COS（对象存储）命令行工具插件，集成于 `tccli` 中，提供完整的 COS 文件管理能力。

## 目录

- [全局参数](#全局参数)
- [文件操作](#文件操作)
  - [list - 列出文件](#list---列出文件)
  - [upload - 上传文件](#upload---上传文件)
  - [download - 下载文件](#download---下载文件)
  - [delete - 删除文件](#delete---删除文件)
  - [copy - 复制文件](#copy---复制文件)
  - [move - 移动/重命名文件](#move---移动重命名文件)
  - [cat - 查看文件内容](#cat---查看文件内容)
  - [head - 查询对象元信息](#head---查询对象元信息)
  - [hash - 计算哈希值](#hash---计算哈希值)
- [同步操作](#同步操作)
  - [sync_upload - 同步上传](#sync_upload---同步上传)
  - [sync_download - 同步下载](#sync_download---同步下载)
  - [sync_copy - 同步复制](#sync_copy---同步复制)
- [存储桶操作](#存储桶操作)
  - [list_buckets - 列出存储桶](#list_buckets---列出存储桶)
  - [create_bucket - 创建存储桶](#create_bucket---创建存储桶)
  - [delete_bucket - 删除存储桶](#delete_bucket---删除存储桶)
- [统计操作](#统计操作)
  - [du - 统计大小](#du---统计大小)
- [归档恢复](#归档恢复)
  - [restore - 恢复归档文件](#restore---恢复归档文件)
- [预签名 URL](#预签名-url)
  - [signurl - 生成预签名URL](#signurl---生成预签名url)
- [ACL 权限管理](#acl-权限管理)
  - [get_bucket_acl - 获取存储桶ACL](#get_bucket_acl---获取存储桶acl)
  - [put_bucket_acl - 设置存储桶ACL](#put_bucket_acl---设置存储桶acl)
  - [get_object_acl - 获取对象ACL](#get_object_acl---获取对象acl)
  - [put_object_acl - 设置对象ACL](#put_object_acl---设置对象acl)
- [标签管理](#标签管理)
  - [get_object_tagging - 获取对象标签](#get_object_tagging---获取对象标签)
  - [put_object_tagging - 设置对象标签](#put_object_tagging---设置对象标签)
  - [delete_object_tagging - 删除对象标签](#delete_object_tagging---删除对象标签)
- [分片上传管理](#分片上传管理)
  - [lsparts - 列出分片上传](#lsparts---列出分片上传)
  - [abort - 清理分片上传](#abort---清理分片上传)
- [附录](#附录)
  - [存储类型说明](#存储类型说明)
  - [失败日志格式](#失败日志格式)

---

## 全局参数

所有命令均支持以下全局参数（通过 `tccli` 统一配置）：

| 参数 | 说明 |
|------|------|
| `--region` | 地域，如 `ap-guangzhou`、`ap-beijing` |
| `--secretId` | 腾讯云 SecretId |
| `--secretKey` | 腾讯云 SecretKey |
| `--profile` | 使用指定的配置文件 |

---

## 文件操作

### list - 列出文件

列出 COS 存储桶中的文件，默认只列出当前层级（非递归），支持按前缀过滤和 include/exclude 过滤。

**命令格式：**
```bash
tccli cos list [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称，格式如 `my-bucket-1250000000` |
| `--prefix` | string | ❌ | 空 | 对象键前缀，用于过滤列出的对象 |
| `--marker` | string | ❌ | 空 | 分页标记，从该标记之后开始列出 |
| `--max_keys` | int | ❌ | 1000 | 最大返回数量，最大 1000 |
| `--delimiter` | string | ❌ | `/` | 分隔符，默认 `/` 模拟目录结构 |
| `--recursive` | bool | ❌ | false | 是否递归列出所有对象 |
| `--include` | string | ❌ | 空 | 包含匹配模式，支持通配符，如 `*.txt` |
| `--exclude` | string | ❌ | 空 | 排除匹配模式，支持通配符，如 `*.log` |

**示例：**
```bash
# 列出存储桶根目录（只显示当前层级）
tccli cos list --bucket my-bucket-1250000000

# 列出指定前缀下的所有文件（递归）
tccli cos list --bucket my-bucket-1250000000 --prefix data/ --recursive true

# 只列出 txt 文件
tccli cos list --bucket my-bucket-1250000000 --prefix logs/ --recursive true --include "*.txt"

# 排除日志文件
tccli cos list --bucket my-bucket-1250000000 --recursive true --exclude "*.log"
```

---

### upload - 上传文件

上传本地文件或目录到 COS，自动根据文件大小选择简单上传或分片上传（默认分片阈值 20MB）。

**命令格式：**
```bash
tccli cos upload [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 目标存储桶名称 |
| `--local_path` | string | ✅ | - | 本地文件或目录路径 |
| `--cos_key` | string | ✅ | - | COS 上的目标对象键（Key），递归上传时作为前缀 |
| `--storage_class` | string | ❌ | STANDARD | 存储类型，见[存储类型说明](#存储类型说明) |
| `--content_type` | string | ❌ | 空 | 文件内容类型（MIME），如 `text/plain` |
| `--meta` | string | ❌ | 空 | 自定义元数据，格式：`key1=value1#key2=value2` |
| `--recursive` | bool | ❌ | false | 是否递归上传目录 |
| `--include` | string | ❌ | 空 | 包含匹配模式（递归时生效），支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式（递归时生效），支持通配符 |
| `--thread_num` | int | ❌ | 5 | 单文件分片上传并发线程数 |
| `--routines` | int | ❌ | 3 | 文件间并发数（同时传输的文件数） |
| `--part_size` | int | ❌ | 20 | 分片大小（MB） |
| `--rate_limiting` | int | ❌ | 0 | 单链接限速（MB/s），0 表示不限速 |
| `--retry` | int | ❌ | 3 | 失败重试次数，0 表示不重试 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径，指定后将失败记录写入该文件 |

**目录上传行为说明：**
- `local_path` 以 `/` 结尾（如 `/tmp/dir/`）：不保留目录名，直接映射内容到 `cos_key` 前缀下
- `local_path` 不以 `/` 结尾（如 `/tmp/dir`）：保留目录名，映射为 `cos_key/dir/` 前缀下

**示例：**
```bash
# 上传单个文件
tccli cos upload --bucket my-bucket-1250000000 --local_path /tmp/test.txt --cos_key data/test.txt

# 上传目录（保留目录名）
tccli cos upload --bucket my-bucket-1250000000 --local_path /tmp/mydir --cos_key backup/ --recursive true

# 上传目录（不保留目录名，直接映射内容）
tccli cos upload --bucket my-bucket-1250000000 --local_path /tmp/mydir/ --cos_key backup/ --recursive true

# 只上传 jpg 图片，使用低频存储，限速 10MB/s
tccli cos upload --bucket my-bucket-1250000000 --local_path /tmp/photos --cos_key images/ \
  --recursive true --include "*.jpg" --storage_class STANDARD_IA --rate_limiting 10

# 上传并记录失败日志
tccli cos upload --bucket my-bucket-1250000000 --local_path /tmp/data --cos_key data/ \
  --recursive true --retry 5 --log_file /tmp/upload_fail.log
```

---

### download - 下载文件

从 COS 下载文件到本地，自动根据文件大小选择简单下载或分片下载。

**命令格式：**
```bash
tccli cos download [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 源存储桶名称 |
| `--cos_key` | string | ✅ | - | COS 上的源对象键（Key），递归下载时作为前缀 |
| `--local_path` | string | ✅ | - | 本地保存路径，递归下载时为目标目录 |
| `--recursive` | bool | ❌ | false | 是否递归下载前缀下所有对象 |
| `--include` | string | ❌ | 空 | 包含匹配模式（递归时生效），支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式（递归时生效），支持通配符 |
| `--thread_num` | int | ❌ | 5 | 单文件分片下载并发线程数 |
| `--routines` | int | ❌ | 3 | 文件间并发数（同时下载的文件数） |
| `--part_size` | int | ❌ | 20 | 分片大小（MB） |
| `--rate_limiting` | int | ❌ | 0 | 单链接限速（MB/s），0 表示不限速 |
| `--version_id` | string | ❌ | 空 | 指定下载的对象版本 ID（开启版本控制时使用） |
| `--retry` | int | ❌ | 3 | 失败重试次数，0 表示不重试 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径 |

**示例：**
```bash
# 下载单个文件
tccli cos download --bucket my-bucket-1250000000 --cos_key data/test.txt --local_path /tmp/test.txt

# 递归下载整个目录
tccli cos download --bucket my-bucket-1250000000 --cos_key data/ --local_path /tmp/data --recursive true

# 只下载 txt 文件，限速 5MB/s
tccli cos download --bucket my-bucket-1250000000 --cos_key logs/ --local_path /tmp/logs \
  --recursive true --include "*.txt" --rate_limiting 5

# 下载指定版本的文件
tccli cos download --bucket my-bucket-1250000000 --cos_key data/test.txt \
  --local_path /tmp/test.txt --version_id MTg0NDUxNTc1NjIzMTQ1MDAwODg

# 下载并记录失败日志
tccli cos download --bucket my-bucket-1250000000 --cos_key data/ --local_path /tmp/data \
  --recursive true --retry 5 --log_file /tmp/download_fail.log
```

---

### delete - 删除文件

删除 COS 存储桶中的指定文件，支持递归批量删除。

**命令格式：**
```bash
tccli cos delete [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 要删除的对象键（Key），递归删除时作为前缀 |
| `--recursive` | bool | ❌ | false | 是否递归删除前缀下所有对象 |
| `--force` | bool | ❌ | false | 递归删除时跳过确认提示 |
| `--include` | string | ❌ | 空 | 包含匹配模式（递归时生效），支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式（递归时生效），支持通配符 |
| `--version_id` | string | ❌ | 空 | 指定删除的对象版本 ID（开启版本控制时使用） |

> ⚠️ 递归删除时，默认会提示确认，使用 `--force true` 可跳过确认。

**示例：**
```bash
# 删除单个文件
tccli cos delete --bucket my-bucket-1250000000 --cos_key data/test.txt

# 递归删除目录（会提示确认）
tccli cos delete --bucket my-bucket-1250000000 --cos_key data/ --recursive true

# 递归删除目录（跳过确认）
tccli cos delete --bucket my-bucket-1250000000 --cos_key data/ --recursive true --force true

# 只删除 log 文件
tccli cos delete --bucket my-bucket-1250000000 --cos_key logs/ --recursive true --force true --include "*.log"

# 删除指定版本的文件
tccli cos delete --bucket my-bucket-1250000000 --cos_key data/test.txt --version_id MTg0NDUxNTc1NjIzMTQ1MDAwODg
```

---

### copy - 复制文件

复制 COS 上的文件到另一个位置，支持跨存储桶和跨地域复制，支持并发和失败重试。

**命令格式：**
```bash
tccli cos copy [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 源存储桶名称 |
| `--cos_key` | string | ✅ | - | 源对象键（Key），递归复制时作为前缀 |
| `--dest_key` | string | ✅ | - | 目标对象键（Key），递归复制时作为目标前缀 |
| `--dest_bucket` | string | ❌ | 同源桶 | 目标存储桶名称 |
| `--dest_region` | string | ❌ | 同当前地域 | 目标地域 |
| `--storage_class` | string | ❌ | 空 | 目标存储类型，见[存储类型说明](#存储类型说明) |
| `--meta` | string | ❌ | 空 | 自定义元数据，格式：`key1=value1#key2=value2`（设置后使用 Replaced 模式） |
| `--recursive` | bool | ❌ | false | 是否递归复制前缀下所有对象 |
| `--include` | string | ❌ | 空 | 包含匹配模式（递归时生效），支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式（递归时生效），支持通配符 |
| `--routines` | int | ❌ | 3 | 文件间并发数（同时复制的文件数） |
| `--retry` | int | ❌ | 3 | 失败重试次数，0 表示不重试 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径 |

**示例：**
```bash
# 同桶内复制单个文件
tccli cos copy --bucket my-bucket-1250000000 --cos_key data/test.txt --dest_key backup/test.txt

# 跨存储桶复制
tccli cos copy --bucket src-bucket-1250000000 --cos_key data/test.txt \
  --dest_bucket dst-bucket-1250000000 --dest_key data/test.txt

# 跨地域复制整个目录
tccli cos copy --bucket src-bucket-1250000000 --cos_key data/ \
  --dest_bucket dst-bucket-1250000000 --dest_key data/ \
  --dest_region ap-beijing --recursive true

# 复制并修改存储类型
tccli cos copy --bucket my-bucket-1250000000 --cos_key data/ --dest_key archive/ \
  --recursive true --storage_class ARCHIVE
```

---

### move - 移动/重命名文件

移动或重命名 COS 上的文件（通过复制+删除实现），支持跨存储桶移动，支持并发和失败重试。

**命令格式：**
```bash
tccli cos move [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 源存储桶名称 |
| `--cos_key` | string | ✅ | - | 源对象键（Key），递归移动时作为前缀 |
| `--dest_key` | string | ✅ | - | 目标对象键（Key），递归移动时作为目标前缀 |
| `--dest_bucket` | string | ❌ | 同源桶 | 目标存储桶名称 |
| `--dest_region` | string | ❌ | 同当前地域 | 目标地域 |
| `--storage_class` | string | ❌ | 空 | 目标存储类型，见[存储类型说明](#存储类型说明) |
| `--recursive` | bool | ❌ | false | 是否递归移动前缀下所有对象 |
| `--include` | string | ❌ | 空 | 包含匹配模式（递归时生效），支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式（递归时生效），支持通配符 |
| `--routines` | int | ❌ | 3 | 文件间并发数（同时移动的文件数） |
| `--retry` | int | ❌ | 3 | 失败重试次数，0 表示不重试 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径 |

**示例：**
```bash
# 重命名单个文件
tccli cos move --bucket my-bucket-1250000000 --cos_key data/old.txt --dest_key data/new.txt

# 移动整个目录
tccli cos move --bucket my-bucket-1250000000 --cos_key data/ --dest_key archive/ --recursive true

# 跨存储桶移动
tccli cos move --bucket src-bucket-1250000000 --cos_key data/ \
  --dest_bucket dst-bucket-1250000000 --dest_key data/ --recursive true

# 移动并记录失败日志
tccli cos move --bucket my-bucket-1250000000 --cos_key data/ --dest_key backup/ \
  --recursive true --retry 5 --log_file /tmp/move_fail.log
```

---

### cat - 查看文件内容

查看 COS 对象的文本内容，默认最大读取 10MB，支持指定字节范围读取。

**命令格式：**
```bash
tccli cos cat [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 对象键（Key） |
| `--range` | string | ❌ | 空 | 指定读取范围，格式：`bytes=0-1023` |
| `--max_size` | int | ❌ | 10 | 最大读取大小（MB），超过此大小仅显示前 N MB |

**示例：**
```bash
# 查看文件内容
tccli cos cat --bucket my-bucket-1250000000 --cos_key logs/app.log

# 查看文件的前 1KB
tccli cos cat --bucket my-bucket-1250000000 --cos_key logs/app.log --range "bytes=0-1023"

# 查看大文件（最多显示 50MB）
tccli cos cat --bucket my-bucket-1250000000 --cos_key data/large.txt --max_size 50
```

---

### head - 查询对象元信息

查询 COS 对象的元数据信息，包括大小、类型、修改时间、ETag、CRC64 等。

**命令格式：**
```bash
tccli cos head [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 要查询的对象键（Key） |
| `--version_id` | string | ❌ | 空 | 指定查询的对象版本 ID（开启版本控制时使用） |

**示例：**
```bash
# 查询对象元信息
tccli cos head --bucket my-bucket-1250000000 --cos_key data/test.txt

# 查询指定版本的元信息
tccli cos head --bucket my-bucket-1250000000 --cos_key data/test.txt --version_id MTg0NDUxNTc1NjIzMTQ1MDAwODg
```

**输出示例：**
```
对象元信息: cos://my-bucket-1250000000/data/test.txt
--------------------------------------------------
Content-Length:  1024
Content-Type:    text/plain
ETag:            "d41d8cd98f00b204e9800998ecf8427e"
Last-Modified:   Mon, 07 Apr 2025 10:00:00 GMT
Storage-Class:   STANDARD
CRC64:           1234567890123456789
```

---

### hash - 计算哈希值

计算本地文件的哈希值，或获取 COS 对象的 ETag/CRC64 信息。

**命令格式：**
```bash
tccli cos hash [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--local_path` | string | ❌ | 空 | 本地文件路径（计算本地文件哈希时使用） |
| `--bucket` | string | ❌ | 空 | 存储桶名称（获取 COS 对象哈希时使用） |
| `--cos_key` | string | ❌ | 空 | 对象键（获取 COS 对象哈希时使用） |
| `--hash_type` | string | ❌ | md5 | 哈希类型：`md5`、`sha1`、`sha256`、`crc64` |

> 注意：`--local_path` 和 `--bucket + --cos_key` 至少指定一组，也可同时指定两组进行对比。

**示例：**
```bash
# 计算本地文件 MD5
tccli cos hash --local_path /tmp/test.txt

# 计算本地文件 SHA256
tccli cos hash --local_path /tmp/test.txt --hash_type sha256

# 获取 COS 对象的 ETag 和 CRC64
tccli cos hash --bucket my-bucket-1250000000 --cos_key data/test.txt

# 同时计算本地和 COS 对象的哈希（用于校验一致性）
tccli cos hash --local_path /tmp/test.txt --bucket my-bucket-1250000000 --cos_key data/test.txt
```

---

## 同步操作

同步操作对齐 `coscli sync` 命令的跳过逻辑（优先级从高到低）：

- `--ignore_existing true`：目标已存在即跳过，不做内容比较
- `--update true`：按 `Last-Modified` 时间比较，目标 ≥ 源时跳过（用于只向新版本推送）
- 默认：**CRC64 校验**（对比 COS `x-cos-hash-crc64ecma` 与对端 CRC64），相同则跳过

> 目标不存在时一律不跳过。CRC64 计算依赖 `crcmod` 库（已包含在项目依赖中）。

### sync_upload - 同步上传

同步本地目录到 COS，增量上传，支持删除 COS 上多余的文件。

**命令格式：**
```bash
tccli cos sync_upload [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 目标存储桶名称 |
| `--local_path` | string | ✅ | - | 本地目录路径 |
| `--cos_key` | string | ❌ | 空 | COS 上的目标前缀 |
| `--recursive` | bool | ❌ | false | 是否递归同步目录 |
| `--delete` | bool | ❌ | false | 是否删除 COS 上多余的文件（本地不存在的） |
| `--include` | string | ❌ | 空 | 包含匹配模式，支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式，支持通配符 |
| `--storage_class` | string | ❌ | STANDARD | 上传时的存储类型 |
| `--content_type` | string | ❌ | 空 | 文件内容类型（MIME） |
| `--meta` | string | ❌ | 空 | 自定义元数据，格式：`key1=value1#key2=value2` |
| `--thread_num` | int | ❌ | 5 | 单文件分片上传并发线程数 |
| `--routines` | int | ❌ | 3 | 文件间并发数 |
| `--part_size` | int | ❌ | 20 | 分片大小（MB） |
| `--rate_limiting` | int | ❌ | 0 | 单链接限速（MB/s） |
| `--retry` | int | ❌ | 3 | 失败重试次数 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径 |

**示例：**
```bash
# 同步本地目录到 COS（增量上传）
tccli cos sync_upload --bucket my-bucket-1250000000 --local_path /data/backup --cos_key backup/ --recursive true

# 同步并删除 COS 上多余的文件（镜像同步）
tccli cos sync_upload --bucket my-bucket-1250000000 --local_path /data/backup --cos_key backup/ \
  --recursive true --delete true

# 只同步 txt 和 csv 文件
tccli cos sync_upload --bucket my-bucket-1250000000 --local_path /data --cos_key data/ \
  --recursive true --include "*.txt" --include "*.csv"

# 同步并记录失败日志
tccli cos sync_upload --bucket my-bucket-1250000000 --local_path /data --cos_key data/ \
  --recursive true --retry 5 --log_file /tmp/sync_fail.log
```

---

### sync_download - 同步下载

同步 COS 到本地目录，增量下载，支持删除本地多余的文件。

**命令格式：**
```bash
tccli cos sync_download [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 源存储桶名称 |
| `--local_path` | string | ✅ | - | 本地目标目录路径 |
| `--cos_key` | string | ❌ | 空 | COS 上的源前缀 |
| `--recursive` | bool | ❌ | false | 是否递归同步目录 |
| `--delete` | bool | ❌ | false | 是否删除本地多余的文件（COS 上不存在的） |
| `--include` | string | ❌ | 空 | 包含匹配模式，支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式，支持通配符 |
| `--thread_num` | int | ❌ | 5 | 单文件分片下载并发线程数 |
| `--routines` | int | ❌ | 3 | 文件间并发数 |
| `--part_size` | int | ❌ | 20 | 分片大小（MB） |
| `--rate_limiting` | int | ❌ | 0 | 单链接限速（MB/s） |
| `--retry` | int | ❌ | 3 | 失败重试次数 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径 |

**示例：**
```bash
# 同步 COS 目录到本地（增量下载）
tccli cos sync_download --bucket my-bucket-1250000000 --cos_key data/ --local_path /tmp/data --recursive true

# 同步并删除本地多余的文件（镜像同步）
tccli cos sync_download --bucket my-bucket-1250000000 --cos_key data/ --local_path /tmp/data \
  --recursive true --delete true

# 只同步图片文件
tccli cos sync_download --bucket my-bucket-1250000000 --cos_key images/ --local_path /tmp/images \
  --recursive true --include "*.jpg" --include "*.png"
```

---

### sync_copy - 同步复制

同步 COS 到另一个 COS 位置，增量复制，支持删除目标端多余的文件。

**命令格式：**
```bash
tccli cos sync_copy [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 源存储桶名称 |
| `--cos_key` | string | ❌ | 空 | 源 COS 前缀 |
| `--dest_bucket` | string | ❌ | 同源桶 | 目标存储桶名称 |
| `--dest_key` | string | ❌ | 空 | 目标 COS 前缀 |
| `--dest_region` | string | ❌ | 同当前地域 | 目标地域 |
| `--recursive` | bool | ❌ | false | 是否递归同步复制 |
| `--delete` | bool | ❌ | false | 是否删除目标端多余的文件（源端不存在的） |
| `--include` | string | ❌ | 空 | 包含匹配模式，支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式，支持通配符 |
| `--storage_class` | string | ❌ | 空 | 目标存储类型 |
| `--meta` | string | ❌ | 空 | 自定义元数据，格式：`key1=value1#key2=value2` |
| `--routines` | int | ❌ | 3 | 文件间并发数 |
| `--retry` | int | ❌ | 3 | 失败重试次数 |
| `--log_file` | string | ❌ | 空 | 失败日志文件路径 |

**示例：**
```bash
# 同步复制到同桶不同前缀
tccli cos sync_copy --bucket my-bucket-1250000000 --cos_key data/ --dest_key backup/ --recursive true

# 跨桶同步复制（镜像同步）
tccli cos sync_copy --bucket src-bucket-1250000000 --cos_key data/ \
  --dest_bucket dst-bucket-1250000000 --dest_key data/ \
  --recursive true --delete true

# 跨地域同步复制
tccli cos sync_copy --bucket src-bucket-1250000000 --cos_key data/ \
  --dest_bucket dst-bucket-1250000000 --dest_key data/ \
  --dest_region ap-beijing --recursive true
```

---

## 存储桶操作

### list_buckets - 列出存储桶

列出当前账号下的所有存储桶，支持按地域过滤。

**命令格式：**
```bash
tccli cos list_buckets [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--filter_region` | string | ❌ | 空 | 按地域过滤，如 `ap-guangzhou` |

**示例：**
```bash
# 列出所有存储桶
tccli cos list_buckets

# 列出广州地域的存储桶
tccli cos list_buckets --filter_region ap-guangzhou
```

---

### create_bucket - 创建存储桶

创建一个新的 COS 存储桶。

**命令格式：**
```bash
tccli cos create_bucket [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称，格式如 `my-bucket-1250000000` |
| `--acl` | string | ❌ | private | 访问控制策略：`private`、`public-read`、`public-read-write` |

**示例：**
```bash
# 创建私有存储桶
tccli cos create_bucket --bucket my-bucket-1250000000

# 创建公开读存储桶
tccli cos create_bucket --bucket my-bucket-1250000000 --acl public-read
```

---

### delete_bucket - 删除存储桶

删除指定的 COS 存储桶，使用 `--force` 可强制清空后删除。

**命令格式：**
```bash
tccli cos delete_bucket [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 要删除的存储桶名称 |
| `--force` | bool | ❌ | false | 强制删除：先清空所有对象、版本对象和未完成的分片上传，再删除存储桶 |

> ⚠️ `--force true` 会**不可逆地**删除存储桶内所有数据，请谨慎使用。

**示例：**
```bash
# 删除空存储桶
tccli cos delete_bucket --bucket my-bucket-1250000000

# 强制清空并删除存储桶
tccli cos delete_bucket --bucket my-bucket-1250000000 --force true
```

---

## 统计操作

### du - 统计大小

统计存储桶或指定前缀下的对象总大小、文件数量和文件夹数量，按存储类型分类统计。

**命令格式：**
```bash
tccli cos du [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--prefix` | string | ❌ | 空 | 对象键前缀，用于统计指定目录的大小 |

**示例：**
```bash
# 统计整个存储桶
tccli cos du --bucket my-bucket-1250000000

# 统计指定目录
tccli cos du --bucket my-bucket-1250000000 --prefix data/
```

**输出示例：**
```
统计: cos://my-bucket-1250000000/data/
------------------------------------------------------------
总文件数: 100
总文件夹数: 5
总大小:   1.23 GB (1321205760 字节)

按存储类型统计:
  STANDARD              95 个对象, 1.20 GB
  STANDARD_IA           5 个对象, 30.00 MB
```

---

## 归档恢复

### restore - 恢复归档文件

恢复归档存储类型（ARCHIVE/DEEP_ARCHIVE）的 COS 对象，使其可被下载。

**命令格式：**
```bash
tccli cos restore [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 要恢复的归档对象键（Key），递归恢复时作为前缀 |
| `--days` | int | ❌ | 7 | 恢复后的有效天数 |
| `--tier` | string | ❌ | Standard | 恢复模式：`Standard`（3-5小时）、`Expedited`（1-5分钟）、`Bulk`（5-12小时） |
| `--recursive` | bool | ❌ | false | 是否递归恢复前缀下所有归档对象 |
| `--include` | string | ❌ | 空 | 包含匹配模式（递归时生效），支持通配符 |
| `--exclude` | string | ❌ | 空 | 排除匹配模式（递归时生效），支持通配符 |

**示例：**
```bash
# 恢复单个归档文件（标准模式，有效期 7 天）
tccli cos restore --bucket my-bucket-1250000000 --cos_key archive/data.zip

# 极速恢复，有效期 30 天
tccli cos restore --bucket my-bucket-1250000000 --cos_key archive/data.zip --tier Expedited --days 30

# 递归恢复整个归档目录
tccli cos restore --bucket my-bucket-1250000000 --cos_key archive/ --recursive true --days 7
```

---

## 预签名 URL

### signurl - 生成预签名URL

生成 COS 对象的预签名 URL，可用于临时授权访问，无需鉴权即可访问。

**命令格式：**
```bash
tccli cos signurl [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 对象键（Key） |
| `--expired` | int | ❌ | 3600 | URL 有效期（秒），默认 1 小时 |
| `--method` | string | ❌ | GET | HTTP 方法：`GET`（下载）、`PUT`（上传） |

**示例：**
```bash
# 生成下载链接（有效期 1 小时）
tccli cos signurl --bucket my-bucket-1250000000 --cos_key data/test.txt

# 生成下载链接（有效期 24 小时）
tccli cos signurl --bucket my-bucket-1250000000 --cos_key data/test.txt --expired 86400

# 生成上传链接（有效期 10 分钟）
tccli cos signurl --bucket my-bucket-1250000000 --cos_key data/upload.txt --method PUT --expired 600
```

---

## ACL 权限管理

### get_bucket_acl - 获取存储桶ACL

获取存储桶的访问控制列表（ACL）。

**命令格式：**
```bash
tccli cos get_bucket_acl --bucket <存储桶名称>
```

**示例：**
```bash
tccli cos get_bucket_acl --bucket my-bucket-1250000000
```

---

### put_bucket_acl - 设置存储桶ACL

设置存储桶的访问控制策略。

**命令格式：**
```bash
tccli cos put_bucket_acl [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--acl` | string | ❌ | 空 | 访问控制策略：`private`、`public-read`、`public-read-write` |
| `--grant_read` | string | ❌ | 空 | 授予读权限的用户，格式：`id="账号ID"` |
| `--grant_write` | string | ❌ | 空 | 授予写权限的用户，格式：`id="账号ID"` |
| `--grant_full_control` | string | ❌ | 空 | 授予完全控制权限的用户，格式：`id="账号ID"` |

**示例：**
```bash
# 设置存储桶为公开读
tccli cos put_bucket_acl --bucket my-bucket-1250000000 --acl public-read

# 授予指定账号读权限
tccli cos put_bucket_acl --bucket my-bucket-1250000000 --grant_read 'id="100000000001"'
```

---

### get_object_acl - 获取对象ACL

获取 COS 对象的访问控制列表（ACL）。

**命令格式：**
```bash
tccli cos get_object_acl --bucket <存储桶名称> --cos_key <对象键>
```

**示例：**
```bash
tccli cos get_object_acl --bucket my-bucket-1250000000 --cos_key data/test.txt
```

---

### put_object_acl - 设置对象ACL

设置 COS 对象的访问控制策略。

**命令格式：**
```bash
tccli cos put_object_acl [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 对象键（Key） |
| `--acl` | string | ❌ | 空 | 访问控制策略：`private`、`public-read` |
| `--grant_read` | string | ❌ | 空 | 授予读权限的用户，格式：`id="账号ID"` |
| `--grant_full_control` | string | ❌ | 空 | 授予完全控制权限的用户，格式：`id="账号ID"` |

**示例：**
```bash
# 设置对象为公开读
tccli cos put_object_acl --bucket my-bucket-1250000000 --cos_key data/test.txt --acl public-read

# 授予指定账号完全控制权限
tccli cos put_object_acl --bucket my-bucket-1250000000 --cos_key data/test.txt \
  --grant_full_control 'id="100000000001"'
```

---

## 标签管理

### get_object_tagging - 获取对象标签

获取 COS 对象的标签信息。

**命令格式：**
```bash
tccli cos get_object_tagging --bucket <存储桶名称> --cos_key <对象键>
```

**示例：**
```bash
tccli cos get_object_tagging --bucket my-bucket-1250000000 --cos_key data/test.txt
```

---

### put_object_tagging - 设置对象标签

设置 COS 对象的标签，格式为 `key1=value1,key2=value2`。

**命令格式：**
```bash
tccli cos put_object_tagging [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--cos_key` | string | ✅ | - | 对象键（Key） |
| `--tags` | string | ✅ | - | 标签列表，格式：`key1=value1,key2=value2` |

**示例：**
```bash
# 设置单个标签
tccli cos put_object_tagging --bucket my-bucket-1250000000 --cos_key data/test.txt --tags "env=prod"

# 设置多个标签
tccli cos put_object_tagging --bucket my-bucket-1250000000 --cos_key data/test.txt \
  --tags "env=prod,project=myapp,owner=team1"
```

---

### delete_object_tagging - 删除对象标签

删除 COS 对象的所有标签。

**命令格式：**
```bash
tccli cos delete_object_tagging --bucket <存储桶名称> --cos_key <对象键>
```

**示例：**
```bash
tccli cos delete_object_tagging --bucket my-bucket-1250000000 --cos_key data/test.txt
```

---

## 分片上传管理

### lsparts - 列出分片上传

列出存储桶中未完成的分片上传任务。

**命令格式：**
```bash
tccli cos lsparts [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--prefix` | string | ❌ | 空 | 对象键前缀，用于过滤列出的分片上传 |

**示例：**
```bash
# 列出所有未完成的分片上传
tccli cos lsparts --bucket my-bucket-1250000000

# 列出指定前缀下的未完成分片上传
tccli cos lsparts --bucket my-bucket-1250000000 --prefix data/
```

---

### abort - 清理分片上传

清理存储桶中未完成的分片上传任务，释放存储空间。

**命令格式：**
```bash
tccli cos abort [参数]
```

**参数说明：**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `--bucket` | string | ✅ | - | 存储桶名称 |
| `--prefix` | string | ❌ | 空 | 对象键前缀，用于过滤要清理的分片上传 |
| `--cos_key` | string | ❌ | 空 | 对象键（指定 `upload_id` 时必填） |
| `--upload_id` | string | ❌ | 空 | 指定要取消的分片上传 ID，不填则清理所有未完成的分片上传 |

**示例：**
```bash
# 清理所有未完成的分片上传
tccli cos abort --bucket my-bucket-1250000000

# 清理指定前缀下的未完成分片上传
tccli cos abort --bucket my-bucket-1250000000 --prefix data/

# 取消指定的分片上传
tccli cos abort --bucket my-bucket-1250000000 --cos_key data/large.zip \
  --upload_id 1585130821cbb7df1d11846c073ad7cf9d27a33
```

---

## 附录

### 存储类型说明

| 存储类型 | 说明 | 适用场景 |
|----------|------|----------|
| `STANDARD` | 标准存储（默认） | 高频访问数据 |
| `STANDARD_IA` | 低频存储 | 低频访问，存储 30 天以上 |
| `ARCHIVE` | 归档存储 | 极少访问，需要恢复后才能下载 |
| `DEEP_ARCHIVE` | 深度归档存储 | 长期保存，访问频率极低 |
| `INTELLIGENT_TIERING` | 智能分层存储 | 访问模式不固定的数据 |
| `MAZ_STANDARD` | 多 AZ 标准存储 | 高可用要求的高频访问数据 |
| `MAZ_STANDARD_IA` | 多 AZ 低频存储 | 高可用要求的低频访问数据 |

### 失败日志格式

当指定 `--log_file` 参数时，失败的操作会以 JSON Lines 格式记录到日志文件中，每行一条记录：

```json
{
  "time": "2025-04-07 10:00:00",
  "operation": "upload",
  "src": "/local/path/to/file.txt",
  "dest": "cos://my-bucket-1250000000/data/file.txt",
  "reason": "AccessDenied (Code: AccessDenied)",
  "request_id": "NjBhMzYyMDdfOTBmYTUwNjRfMjI4NV8xNjA="
}
```

**字段说明：**

| 字段 | 说明 |
|------|------|
| `time` | 失败发生的时间 |
| `operation` | 操作类型（upload/download/copy/move/delete） |
| `src` | 源路径（本地路径或 `cos://` 路径） |
| `dest` | 目标路径（本地路径或 `cos://` 路径） |
| `reason` | 失败原因（包含错误信息和错误码） |
| `request_id` | COS 请求 ID，用于排查问题 |

**使用示例：**
```bash
# 上传并记录失败日志
tccli cos upload --bucket my-bucket-1250000000 --local_path /data --cos_key data/ \
  --recursive true --log_file /tmp/upload_fail.log

# 查看失败日志
cat /tmp/upload_fail.log
```
