# BOS Util云端批量操作工具
 
该命令行工具基于java命令行编写, 提供对BOS端数据的批量操作, 主要包含批量设置
metadata, 批量删除文件, 批量重命名文件，批量设置object访问权限, 修改prefix(目录), 
计算给定prefix(目录)下所有文件大小的总和等功能. 

## 安装与配置

该工具以jar包形式发布, 作为java命令行的"-jar"参数使用, 不需要任何安装过程也无任
何外部依赖. 只需要有java运行环境, 且版本在1.8及以上, 可以使用命令`javac
-version`检测, 若显示java版本为1.8及以上即可, 否则请安装或升级java环境. 

## 命令格式

命令可以使用的选项:

option              | meaning                                                                         | has args | default arg | example
-----               | -----                                                                           | -----    | -----       | -----
-ak                 | access key, 如何获取AK/SK, 请参见[如何获取AK/SK](GetAKSK#如何获取AK / SK)       | yes      | -           | -
-sk                 | secrete key, 如何获取AK/SK, 请参见[如何获取AK/SK](GetAKSK#如何获取AK / SK)      | yes      | -           | -
-endpoint           | BOS endpoint, 关于BOS endpoint的详细描述请参见[BOS访问域名](DevRef#BOS访问域名) | yes      | -           | http://bj.bcebos.com
-cmd                | 当前将要执行的命令                                                              | yes      | -           | `SET_OBJECTS_META` 
-bucketName         | 需要操作的bucket名称                                                            | yes      | -           |
-objectName         | 需要操作的object名称                                                            | yes      | -           |
-prefix             | 需要操作的名称以此prefix开头的object                                            | yes      | -           |
-marker             | list object所使用的marker                                                       | yes      | -           |
-objectList         | 一个object列表文件的路径, 此文件包需要操作的object                              | yes      | -           |
-threadNumber       | 批量操作时使用的并发线程数                                                      | yes      | 1           |
-defaultContentType | 设置content-type时的默认content-type                                            | yes      | -           |
-contentType        | 用户指定的对应后缀使用的content-type                                            | yes      | -           | ".txt:text/plain;.flv:video/flv"
-meta               | 用户指定的meta                                                                  | yes      | -           | `"cacheControl:max-age 18080|__user_meta__path:aa/bb/cc"`
-canned             | 通过使用头域的"x-bce-acl"字段来设置object访问权限                                  | yes      | -           | "PRIVATE"
-aclConfigFile      | 提供一个ACL文件                                                                  |yes      | -           | "example.txt"
-extension          | 测试bos util支持的后缀                                                          | yes      | -           | .txt
-replace            | 是否完全替换object的meta, true: 完全替换, false: 更新部分字段                   | no       | false       |

上表中, `-`表示该列不适用于该选项.

该工具的通用命令格式如下:
```
    java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
          -cmd {command} [-bucketName {bucket_name}] [-other_options {option_value}...]
```

上述格式中使用"{}"的字段为必需参数, 对应参数值应使用双引号包含, 如:
`-endpoint "http://bj.bcebos.com"`. 
使用"[]"的字段为可选参数, 具体由cmd参数决定. 

**以下示例均为Linux/Unix环境下, 如果在windows下使用需要注意:**
1. 命令折行使用`^`
2. 对`"`的使用: windows下不能使用`'`括起参数, 必须使用`"`, 如果参数中包含`"`, 需
	 要使用`\"`进行转义

对于"-cmd"这个选项, 只能从以下支持的命令中选取一个执行:   

命令                               | 意义                                    | 备注
-----                              |-----                                    |-----
LIST_OBJECTS                       | 列举存在bos上的object                   |
SET_CONTENT_TYPE_BY_FILE_EXTENSION | 根据object的后缀名设置content-type      |
GET_OBJECTS_META                   | 批量获取object的meta                    |
DELETE_OBJECTS                     | 批量删除object                          |
SET_OBJECTS_META                   | 设置object的meta                        |
SET_OBJECTS_ACL                    | 设置object的acl                         |
TEST_CONTENT_TYPE                  | 查看某种类型在本工具中对应的content-type  |
RENAME_OBJECTS                     | 批量重命名object                        |
CHANGE_PREFIX                      | 批量修改object的prefix                  |
COMPUTE_SIZE                       | 计算某个bucket和prefix                  |
TEST_SPEED                         | 测试上传下载速度                        |

## 命令详细说明

下面详细说明所支持的命令与选项. 

### 公共选项

下表列举了命令行支持的公共选项, 这四个选项为命令格式中给出的必需选项, 其它选项依
据指定cmd选择设置. 

选项      | 描述                                                                            | 是否有参数值 | 默认值 | 示例
-----     | -----                                                                           | -----        | -----  | -----
-ak       | access key, 如何获取AK/SK, 请参见[如何获取AK/SK](GetAKSK#如何获取AK/SK)         | yes          | -      | -
-sk       | secrete key, 如何获取AK/SK, 请参见[如何获取AK/SK](GetAKSK#如何获取AK/SK)        | yes          | -      | -
-endpoint | BOS endpoint, 关于BOS endpoint的详细描述请参见[BOS访问域名](DevRef#BOS访问域名) | yes          | -      | http://bj.bcebos.com
-cmd      | 当前将要执行的命令                                                              | yes          | -      | `SET_OBJECTS_META` 

该工具所有涉及到输入参数包含中文内容的地方(包括各个参数的值, 输入的objectList文
件), 一律使用UTF-8编码, 所有涉及到输出的结果(命令行输出, 保存的结果文件)也一
律使用UTF-8编码. 


### LIST_OBJECTS

**功能**

递归列举用户给定bucket下的所有objects信息到文件. 

**语法**

```shell
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd LIST_OBJECTS -bucketName {bucket_name}
```

**选项**

必需的ak, sk, endpoint, cmd参数, 以及列举的bucket的名称参数bucketName. 

选项       | 描述        | 示例      | 是否必选
-------    |-------------|--------   |--------
bucketName | bucket 名称 | "bucket1" | 是

其他额外参数若指定会忽略. 

**详细说明**

该命令会列举指定bucket下所有objects列表到一个本地文件中, 该文件保存在java运行时
的同一目录下, 以给出的bucketName与"_object_list"组合作为文件名称. 如给出的
bucketName为"mybucekt", 当前java运行目录为"/home/user1", 则会生成一个
"/home/user1/mybucket_object_list"的文件, 该文件每一行为一个object的信息, 分别为
bucket名称, object全称(包含prefix), object大小, object的最后修改时间以及obejct
的etag, 输出文件各列按照`\t`(tab)分隔, 格式示例如下: 

```text
BucketName\tObjectKey\tSize\tLastModified\tEtag\tStorageClass\n
... ... ... ...
```

**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd LIST_OBJECTS -bucketName "bucket"
```

### SET_CONTENT_TYPE_BY_FILE_EXTENSION

**功能**

该命令设置给定object的contentType信息. 

**语法**

```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd SET_CONTENT_TYPE_BY_FILE_EXTENSION
    [-objectList {objectListFilePath}] | 
    [-bucketName {bucket_name}
    -objectName {object_name}
    -prefix {prefix}
    -marker {marker}
    -contentType {content-type}
    -defaultContentType {default content-type}
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项               | 描述                                                                                   | 示例                             | 是否必选
-------            |-------------                                                                           |--------                          |--------
bucketName         | bucket名称                                                                             | "bucket1"                        | 否
objectName         | object名称                                                                             | "prefix1/object1"                | 否
prefix             | 待设置object的prefix                                                                   | "prefix1"                        | 否
marker             | 待设置object的marker                                                                   | ""                               | 否
objectList         | 包含bucket与object名称列表的文件路径, 文件中具体内容依赖使用的命令, 文件编码必需为utf8 | "list-file-name"                 | 否
contentType        | 用户指定的Content-Type metadata信息                                                    | ".txt:text/plain;.flv:video/flv" | 否
defaultContentType | 依据后缀查找的Content-Type在失败时使用的默认值                                         | "application/otect-stream"       | 否


**详细说明**

该命令依据AK/SK信息, 在指定的endpoint下, 为**选项**中指定的Object设置
content-type信息. 

该工具内置了一个常见后缀名与Content-Type的字典. 对于待设置Content-Type的object, 
Util工具会根据用户指定的contentType参数, 内置字典和defaultContentType参数, 依据
如下规则决定其Content-Type: 

1. 先获得该object的后缀名, 和命令行中的contentType参数进行匹配, 若精确指定了就使
	 用指定的contentType参数. 如某个object的后缀名为".js", 而contentType参数中存在
	 一项为".js:text/javascript"则精确指定了. 
2. 若命令行中没有精确指定contentType参数, 就判断contentType中是否有模糊指定
	 ".*:text/plain", 若有则使用之; 若模糊指定没有, 或者没有给出contentType参数, 
	 就前往内置字典获取该object的后缀名对应的Content-Type. 若获取成功就使用内置的
	 Content-Type进行设置; 
3. 若内置字典也没有匹配到, 则按照命令行中defaultContentType参数指定的值进行设置
	 . 若命令行中没有设置defaultContentType参数, 则直接返回, 对该object不作任何设
	 置, 并将该object打印到命令行. 

该命令提供两种方式指定待设置Content-Type的object. 

- -objectList方式: 即提供一个object列表文件, 各列使用`\t`(tab)分隔, 每行的格式为
	"BucketName\tObjectName". 
- -bucketName -objectName -prefix -marker 方式: 即使用bucketName, 
	prefix, marker, objectName进行匹配. 该方式必须提供bucketName参数指
	定bucket, 其余参数支持以objectName进行精确指定的方式进行, 同时支持使用prefix, 
	marker的方式进行模糊匹配. 其中marker的使用方式是:用户初次执行只需要
	输入prefix, 如果执行到一半失败了, 不必重新开始执行, 只需要找到当前目
	录下last_marker+${bucket_name}.txt这个文件, 拿到最后一行(格式为<object名字 已完成任务数量>),
	将object名字作为marker的值再次执行命令则可继续上次未完成的批量操作任务. 


**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd SET_CONTENT_TYPE_BY_FILE_EXTENSION \
    -defaultContentType "text/plain" \
    -contentType ".js:text/javascript;.flv:video/flv" \
    -objectList "./a/filelist"
```
```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd SET_CONTENT_TYPE_BY_FILE_EXTENSION \
    -defaultContentType "text/plain" \
    -contentType ".js:text/javascript;.flv:video/flv" \
    -bucketName "abc" \
    -objectName "test-object"
```

### SET_OBJECTS_ACL

**功能**

该命令设置给定object的acl信息

**语法**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_secret_key"
    -cmd SET_OBJECTS_ACL
    -bucketName {bucket_name}
    [-objectName {object_name}] |
    [-prefix {prefix}]
    [-marker {marker}]
    [-canned {canned acl}] |
    [-aclConfigFile {acl_config_file}]
    [-threadNumber {concurrent number}]
```

**选项**

除了必须的ak、sk、endpoint、cmd参数外，其他参数见下表：

选项       | 描述        | 示例        | 是否必选
-----------|------------|-------------|---------
bucketName | bucket名称  | "bucket1"   | 是
objectName | object名称  | "prefix1/object1"  | 否
prefix     | 待设置object的prefix | "prefix1" | 否
marker     | 待设置object的market | ""  | 否
canned     | 通过使用头域的"x-bce-acl"字段来设置object访问权限，支持：PRIVATE、PUBLIC-READ | "PRIVATE" | 否
aclConfigFile | 提供一个ACL文件，文件格式参见[ACL文件格式](https://cloud.baidu.com/doc/BOS/s/Tjwvysda9#%E4%B8%8A%E4%BC%A0acl%E6%96%87%E4%BB%B6%E6%96%B9%E5%BC%8F%E7%9A%84%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6)，目前ACL文件只支持accessControlList，grantee，permission字段 | "example.txt" | 否
threadNumber | 并发数，默认值是1 | 10 | 否

**详细说明**

该命令依据AK/SK信息，在指定的endpoint下，为选项中指定的Object设置acl信息。

该工具支持两种方式为object设置acl信息：

1. 通过canned参数，指定object的访问权限，支持PRIVATE和PUBLIC-READ；
2. 通过aclConfigFile参数，提供一个ACL文件，文件内容为JSON格式，具体如下：
   ```json
   {
        "accessControlList": [
            {
                "grantee": [
                    {
                        "id": "e13b12d0131b4c8bae959df4969387b8"
                    }
                ],
                "permission": [
                    "READ"
                ]
            }
        ]
    }
    ```
该命令提供指定待设置acl的object方式如下：
* -bucketName -objectName -prefix -marker方式: 即使用bucketName、prefix、marker、objectName进行匹配。该方式必须提供bucketName参数指定bucket，其余参数支持以objectName进行精确指定的方式进行，同时支持使用prefix、marker的方式进行模糊匹配。其中marker的使用方式是:用户初次执行只需要输入prefix, 如果执行到一半失败了, 不必重新开始执行, 只需要找到当前目录下last_marker+${bucket_name}.txt这个文件, 拿到最后一行(格式为<object名字 已完成任务数量>), 将object名字作为marker的值再次执行命令则可继续上次未完成的批量操作任务。

**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_secret_key" \
    -cmd SET_OBJECTS_ACL \
    -bucketName "bucket1" \
    -objectNmae "prefix1/object1" \
    -canned "PRIVATE"
```

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_secret_key" \
    -cmd SET_OBJECTS_ACL \
    -bucketName "bucket1" \
    -prefix "prefix" \
    -marker "" \
    -canned "PRIVATE"
```

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_secret_key" \
    -cmd SET_OBJECTS_ACL \
    -bucketName "bucket1" \
    -prefix "prefix" \
    -marker "" \
    -aclConfigFile "example.txt"
```

### TEST_CONTENT_TYPE

**功能**

Util工具内置了一个常见后缀名与Content-Type的字典, 可以通过TEST_CONTENT_TYPE命令
测试字典里所预置的Content-Type. 

**语法**

```
java -jar bosutil.jar \
    -cmd TEST_CONTENT_TYPE \
    -extension {extension-value}
```

**选项**

必需的参数为cmd以及extension参数. 

选项      | 描述        | 示例    | 是否必选
-------   |-------------|-------- |-------- 
extension | 文件扩展名  | .txt    |是

其他额外参数若指定会忽略. 

**详细说明**

该命令仅用来进行获取指定后缀名的Content-Type信息, 因此不需要与bos端交互, 无需指
定AK/SK以及endpoint信息, 只需提供待测试的后缀名参数, 然后根据内部支持的
Content-Type设置规则返回相应信息到命令行, 对于不支持的后缀名返回不支持的提示信息
. 

**使用示例**

```shell
java -jar bosutil.jar -cmd TEST_CONTENT_TYPE -extension ".mp4"
```

### GET_OBJECTS_META

**功能**

依据用户指定的object获取方式获取这些object的metadata信息. 

**语法**

```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd GET_OBJECTS_META
    [-objectList {objectListFilePath}] | 
    [-bucketName {bucket_name}
    -objectName {object_name}
    -prefix {prefix}
    -marker {marker}
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项       | 描述                                                                                   | 示例              | 是否必选
-------    |-------------                                                                           |--------           |--------
bucketName | bucket名称                                                                             | "bucket1"         | 否
objectName | object名称                                                                             | "prefix1/object1" | 否
prefix     | object的prefix                                                                         | "prefix1"         | 否
marker     | object的marker                                                                         | ""                | 否
objectList | 包含bucket与object名称列表的文件路径, 文件中具体内容依赖使用的命令, 文件编码必需为utf8 | "list-file-name"  | 否


**详细说明**

该命令依据AK/SK信息, 在指定的endpoint下, 依据**选项**中说明的两种方式获取Object
并获取这些object的metadata信息, 每个object的metadata信息为一行输出到命令行显示. 

支持如下两种方式获取object, 从而进行metadata信息的获取: 

- -objectList方式: 即提供一个object列表文件, 各列使用`\t`(tab)分隔, 每行的格式为
	"BucketName\tObjectName". 
- -bucketName -objectName -prefix -marker 方式: 即使用bucketName, 
	prefix, marker, objectName进行匹配. 该方式必须提供bucketName参数指
	定bucket, 其余参数支持以objectName进行精确指定的方式进行, 同时支持使用prefix, 
	marker的方式进行模糊匹配. 其中marker的使用方式是:用户初次执行只需要
	输入prefix, 如果执行到一半失败了, 不必重新开始执行, 只需要找到当前目
	录下last_marker+${bucket_name}.txt这个文件, 拿到最后一行(格式为<object名字 已完成任务数量>),
	将object名字作为marker的值再次执行命令则可继续上次未完成的批量操作任务. 

上述两种方式由用户选取一种即可, 若同时指定, 则会选取第一种从objectList参数中读取
的方式, 忽略第二种方式指定的参数. 其他额外参数若指定会忽略. 

**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd GET_OBJECTS_META \
    -objectList "./a/filelist"
```
```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd GET_OBJECTS_META \
    -bucketName "abc" \
    -objectName "test-object"
```

### SET_OBJECTS_META

**功能**

依据用户指定的object获取方式设置这些object的metadata信息. 

**语法**

```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd SET_OBJECTS_META
    -bucketName {bucket_name}
    -objectName {object_name}
    -prefix {prefix}
    -marker {marker}
    -meta {metadata_string}
    -replace
    -threadNumber {concurrent_number}
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项         | 描述                                                  | 示例                         | 是否必选
-------      |-------------                                          |--------                      |--------
bucketName   | bucket名称                                            | "bucket1"                    | 是
objectName   | object名称                                            | "prefix1/object1"            | 否
prefix       | 待设置object的prefix, 或修改的prefix                  | "prefix1"                    | 否
marker       | 待设置object的marker                                  | ""                           | 否
meta         | object的meta信息                                      | "cacheControl:max-age 18080" | 是
replace      | 设置meta信息时是否替换原有meta数据, 取值为true和false | true                         | 否
threadNumber | 并发数, 默认值是1                                     | 10                           | 否

必选参数meta和replace说明如下, 其他额外参数若指定会忽略: 

* meta: 以"key:value"方式给出metadata信息, 多条信息以"|"连接, 作为一个字符串参数
	提供.
	1. meta value内容支持变量表达式:
		* `${object_basename}` --- object的basename, 在批量处理object的meta的时候对
			于不同的object的同个meta字段的值是不一样的, 如设置`content-disposition`等,
			就需要使用此变量达到设置的目的
	2. meta中可以设置用户自己的user meta, user meta的key必须以`__user_meta__`开头
* replace: 该参数如果提供表示替换object原有的metadata信息, 否则不进行替换(默认
	不替换). 不替换即将原先的meta和新的meta合并, 如果新meta和原meta内容有重复则用
	新meta. 

**详细说明**

该命令依据AK/SK信息, 在指定的endpoint下, 依据**选项**中说明的object获取方式, 并
根据meta和replace参数依次对获取的这些object的metadata信息进行设置. 成功或错误信
息会输出到命令行中. 

使用如下方式获取需要设置metadata的objects: 

-bucketName -objectName -prefix -marker方式: 即使用bucketName, prefix
, marker, objectName进行匹配. 该方式必须提供bucketName参数指定bucket
, 其余参数支持以objectName进行精确指定的方式进行, 同时支持使用prefix,
, marker的方式进行模糊匹配. 其中marker的使用方式是:用户初次执行只需要输入
prefix, 如果执行到一半失败了, 不必重新开始执行, 只需要找到当前目录下
last_marker+${bucket_name}.txt这个文件, 拿到最后一行(格式为<object名字 已完成任务数量>), 将object名字作
为marker的值再次执行命令则可继续上次未完成的批量操作任务. 


**使用示例**

linux/macOS

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd SET_OBJECTS_META \
    -bucketName "test-bueckt" \
    -prefix "test-" \
    -meta 'contentType:text/javascript|contentEncoding:gb18030|contentDisposition:attachment; filename="${object_basename}"|__user_meta__path:a/b' \
    -replace
```

windows, **注意双引号`"`的转义**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" ^
    -cmd SET_OBJECTS_META ^
    -bucketName "test-bueckt" ^
    -prefix "test-" ^
    -meta "contentType:text/javascript|contentEncoding:gb18030|contentDisposition:attachment; filename=\"${object_basename}\"|__user_meta__path:a/b" ^
    -replace
```

### DELETE_OBJECTS

**功能**

依据用户指定的object获取方式批量删除获取的Object. 

>**注意: ***该操作执行后不可恢复, 请慎重操作*. 

**语法**
```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd DELETE_OBJECTS
    [-objectList {objectListFilePath}] | 
    [-bucketName {bucket_name}
    -objectName {object_name}
    -prefix {prefix}
    -marker {marker}
    -include {include}
    -preview {preview}
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项       | 描述                                                                                   | 示例              | 是否必选
-------    |-------------                                                                           |--------           |--------
bucketName | bucket 名称                                                                            | "bucket1"         | 否
objectName | object 名称                                                                            | "prefix1/object1" | 否
prefix     | 列举object时的prefix, 或修改的prefix                                                   | "prefix1"         | 否
marker     | 列举object时的marker                                                                   | ""                | 否
objectList | 包含bucket与object名称列表的文件路径, 文件中具体内容依赖使用的命令, 文件编码必需为utf8 | "list-file-name"  | 否
include    | 删除指定bucket下符合正则表达式的object | "object.*jpeg" | 否
preview    | 预览即将删除的object列表，可以配合include参数确定设置的正则表达式是否符合预期，不会实际删除object，默认值为true，执行实际删除命令时需要设置为false | true/false | 否

**详细说明**

该命令依据AK/SK信息, 在指定的endpoint下, 批量删除**选项**中指定方式获取的Object
, 若有删除出错的object, 会讲错误信息打印到命令行中. 该命令在执行过程中若同时有
object上传, 且Object的prefix与正在删除的prefix匹配, 此时无法保证新上传的object被
删除. 

使用include正则匹配删除object时，确保正则表达式是符合预期的情况下再执行命令，可以配合preview参数提前获取即将删除的object列表。

如果指定`objectList`, 则只删除这个文件列举的所有文件, 文件中各列按照`\t`(tab)
分隔, 内容格式为

	${bucketName}\t${objectName}

**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd DELETE_OBJECTS \
    -objectList "./a/filelist"
```
```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd DELETE_OBJECTS \
    -bucketName "test-bucket" \
    -prefix "test-"
```
```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd DELETE_OBJECTS \
    -bucketName "test-bucket" \
    -prefix "test-"
    -include "test-.*jpeg"
    -preview "true"
```

### RENAME_OBJECTS

**功能**

依据用户指定的object重命名信息的文件批量进行重命名操作. 

**语法**

```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd RENAME_OBJECTS
    -objectList {objectListFilePath}
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项       | 描述                                                                                                                                                        | 示例             | 是否必选
-------    |-------------                                                                                                                                                |--------          |--------
objectList | 提供一个每一行都为一条重命名信息的文件的路径, 各列使用`\t`(tab)分隔, 每行的格式为: `SrcBucketName\tSrcObjectName\tDstBucketName\tDstObjectName`, 如: `bucketA	p1/o1	bucketB	p2/o2` | "list-file-name" | 是

**详细说明**

该命令依据AK/SK信息, 在指定的endpoint下, 对**选项**中指定的文件, 批量操作该文件
提供的每条重命名信息, 进行重命名操作. 该命令的操作分为两步, 首先进行复制操作, 再
进行删除操作, 因此如果有任何一步出错都会执行恢复操作进行回退, 并输出出错信息. 

该命令会自动读取文件并对每一行指定源object与新的名称进行批量重命名操作, 处理的这
个文件的进度信息保存在以"`last_marker_`"开头, 后接objectList文件名的basename, 再
以".txt"为扩展名的文件中(如`last_marker_objectlist.txt`), 保存了objectList行数
与实际处理的object数目. 其他额外参数若指定会忽略. 

**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd RENAME_OBJECTS \
    -objectList "./rename-file-list"
```	

### CHANGE_PREFIX

**功能**

依据用户指定的bucket下的prefix, 对prefix进行修改. 

**语法**
```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd CHANGE_PREFIX
    -bucketName {bucket_name}
    -prefix {original_preifx}
    -newPrefix {new_prefix}
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项       | 描述                                         | 示例      | 是否必选
-------    |-------------                                 |--------   |--------
bucketName | 需要修改的bucket名称                         | "bucket1" | 是
prefix     | 需要修改的prefix名称, 类似需要修改的目录名称 | "prefix1" | 是
newPrefix  | 修改后的新的prefix名称, 类似新文件夹名称     | "prefix2" | 是

其他额外参数若指定会忽略. 

**详细说明**

该命令模拟文件夹方式进行目录重命名操作. 依据AK/SK信息, 在指定endpoint下的bucket
中, 找到preifx下所有obejct, 依次对每个object构造新的prefix下的名称, 批量进行重命
名. 每个重命名prefix的操作分为两步, 首先进行复制操作, 再进行删除操作, 因此如果有
任何一步出错都会执行恢复操作进行回退, 并输出出错信息. 在执行过程中若同时有object
上传到相同prefix下不能保证新上传的Object被修改. 

**使用示例**

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd CHANGE_PREFIX \
    -bucketName "mybucket" \
    -prefix "test" \
    -newPrefix "demo"
```	

### COMPUTE_SIZE

**功能**

依据用户指定的bucket下的prefix, 计算整个prefix下所有object的总大小. 

**语法**

```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd COMPUTE_SIZE
    -bucketName {bucket_name}
    [-prefix {preifx}]
    [-friendly {friendly}]
    [-level {level}]
    [-threadNumber {concurrent_number}]
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项       | 描述                                                          | 示例      | 是否必选
-------    |-------------                                                  |--------   |--------
bucketName | 操作的bucket名称                                              | "bucket1" | 是
prefix     | 需要计算大小prefix名称, 类似需要计算大小的的目录名            | "prefix1" | 否
friendly   | 设置计算prefix的大小时是否以可读的友好方式输出, 默认值为false | -         | 否
level      | 相对prefix的下级目录层级数, 例如当设置level为2时, 所有prefix/a/b/、prefix/a/c/目录的总个数, 配合threadNumber使用，一般设置prefix/{level}/个数为threadNumber100倍以内，默认值为0，不可为负值 | 2 | 否
threadNumber | 并发数，默认值是1 | 10 | 否

其他额外参数若指定会忽略. 


**详细说明**

该命令模拟文件夹进行目录大小计算的操作. 将依据AK/SK信息, 在指定endpoint下的
bucket中, 找到preifx下所有obejct, 依次获取每个object的大小并进行批量累积计算, 最
后输出该prefix的总大小, 类似于计算整个目录的总大小. 在执行过程中若同时有object上
传到相同prefix下不能保证新上传的Object被计算到, 可以通过设置合适的level和threadNumber值
提高计算并发度，节省运行时间.

**使用示例**
```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd COMPUTE_SIZE \
    -bucketName "mybucket" \
    -prefix "test"
```	

```shell
java -jar bosutil.jar -endpoint "http://bj.bcebos.com" -ak "your_access_key" -sk "your_security_key" \
    -cmd COMPUTE_SIZE \
    -bucketName "mybucket" \
    -level "2" \
    -threadNumber "20"
```	

### TEST_SPEED

**功能**

测试下载速度

**语法**

```
java -jar bosutil.jar -endpoint {endpoint} -ak {access_key} -sk {security_key}
    -cmd TEST_SPEED
    [-testSize 10485760]
```

**选项**

除了必需的ak, sk, endpoint, cmd参数外, 其它参数参见下表: 

选项       | 描述                                                     | 示例      | 是否必选
-------    |-------------                                             |--------   |--------
testSize   | 测试的文件大小(字节), 此文件完全放在内存, 默认为10485760 | 1000000   | 是

其他额外参数若指定会忽略.

