super s3命令行工具

s4cmd的Python项目详细描述


s4cmd

超级S3命令行工具

Build status


作者:周汉阳(http://github.com/chou han yang" rel="nofollow">@chouhanyang)

当前维护者:naveen vardhi(@rozuur);navin pai(@navinpai


S4CMD 2.x的新增功能

  • 完全从旧的BOTO2.x迁移到新的BOTO3库,它提供了更可靠和最新的S3后端。
  • 支持S3--API服务器端加密以及36个新的API传递选项。完整列表请参见API传递选项部分。
  • 支持批量删除(使用delete_objects api),一次调用可删除多达1000个文件。比连续删除快100倍
  • 支持s4cmd_opts环境变量,用于所有s4cmd操作中的常用选项,如--api serversideencryption
  • 支持通过多部分上传移动大于5GB的文件。比移动大文件时的顺序移动操作快20倍以上。
  • 对于所有操作,都支持使用--last modified before--last modified after选项进行时间戳筛选。支持人性化的时间戳,例如--上次修改时间为'2个月前'
  • 更快的上传速度和MD5哈希的延迟计算。
  • 列出大量带有s3分页和内存的文件是限制。
  • 新的目录到目录的dsynccommand是一个更好的独立实现,它取代了原来的基于get/put/mv命令的synccommand。--delete removed适用于所有情况,包括local到s3、s3到local和s3到s3。sync命令保留此版本中的旧行为以保持兼容性。
  • 在Python2和3上都进行了测试。
  • 特别感谢支持s4cmd的onera.com。

动机

s4cmd是一个用于访问 amazon s3,灵感来自 s3cmd

我们已经大量使用s3cmd来处理一些脚本化的、数据密集型的 应用。然而,随着各种小的改进的需要出现,我们 创建了我们自己的实现,s4cmd。它是用来替代 S3CMD用于增强性能和大文件,以及 我们发现有用的其他功能和修复程序。

它力求与s3cmd最常见的使用场景兼容。它 不提供确切的兼容性下降,因为许多角落的情况下 不同的行为似乎更可取,或者用于错误修复。

功能

s4cmd支持用于获取和存储的常规命令 S3中的文件:lsputgetcpmvsyncdeldu

S4CMD的主要特点是:

  • 简单(少于1500行代码)并用纯python实现,基于 在广泛使用的Boto3库中。
  • 多线程/多连接实现可提高所有 命令。与许多网络密集型应用程序(如Web浏览器)一样, 以单线程方式访问s3的效率通常比 同时有多个连接在积极地传输数据。总的来说,我们 从中获得2倍的上传/下载速度。
  • 路径处理:s3不是一个传统的文件系统,它内置了对 目录结构:在内部,只有对象,没有目录或 文件夹。然而,大多数人在层次结构中使用s3,路径是 以斜线分隔,以模拟传统的文件系统。S4CMD如下 更紧密地复制传统文件系统行为的约定 在某些角落里。例如,"ls"和"cp"的工作方式与unix非常相似 贝壳,以避免奇怪的惊喜。(有关示例,请参见下面的兼容性说明。)
  • 通配符支持:通配符,包括多级通配符,如 Unix外壳,已处理。例如: S3://my bucket/my folder/20120512/*/*chunk00?1?
  • 自动重试:延迟后将再次执行失败任务。
  • 对5GB以上文件的多部分上传支持。
  • 对于多部分上传,正确处理md5(对于肮脏的 详情见下文)
  • 其他增强和错误修复:
    • 部分文件创建:如果源文件没有创建空目标文件 存在。避免在命令中断时创建部分输出文件。
    • 一般螺纹安全:工具可以在任何时候被中断或杀死 被子线程阻止或在中留下不完整或损坏的文件 地点:
    • 确保在所有故障情况下退出代码都不为零(非常重要 脚本中的功能)。
    • 符号链接的预期处理(将遵循这些符号链接)。
    • 支持s3://s3n://前缀(后者与 亚马逊Elastic MapReduce)。

限制:

  • 不支持CloudFront或其他功能。
  • 目前,我们用getput模拟sync--递归--强制--同步检查

安装和设置

您可以安装s4cmdpypi

pip install s4cmd
  • 复制或创建符号链接,以便可以运行s4cmd.py作为s4cmd。(只是 一个文件!)
  • 如果您已经有配置s3cmd中的~/.s3cfg文件,则凭证 将使用此文件中的。否则,设置s3_access_键 s3密钥包含s3凭据的环境变量。
  • 如果未提供任何键,但IAM角色与EC2实例关联,则它将 使用透明。

s4cmd命令

s4cmd ls[路径]

列出目录的所有内容。

  • -r/--recursive:递归显示给定路径下的所有内容,包括子目录。
  • -d/--show directory:显示目录项而不是其内容。

s4cmd put[源][目标]

上传本地文件至S3。

  • -r/--recursive:也递归地上传目录。
  • -s/--sync check:检查md5哈希以避免上载相同的内容。
  • -f/--force:覆盖现有文件,而不是显示错误消息。
  • -n/--dry run:模拟操作而不进行真正的上传。

s4cmd get[源][目标]

从s3下载文件到本地文件系统。

  • -r/--递归:also递归下载目录。
  • -s/--sync check:检查md5哈希以避免下载相同的内容。
  • -f/--force:覆盖现有文件,而不是显示错误消息。
  • -n/--dry run:模拟操作,无需真正下载。

s4cmd dsync[源目录][目标目录]

同步两个目录的内容。目录可以是本地目录,也可以是远程目录,但目前不支持两个本地目录。

  • -r/--recursive:也递归地同步目录。
  • -s/--sync check:检查md5哈希以避免同步相同的内容。
  • -f/--force:覆盖现有文件,而不是显示错误消息。
  • -n/--dry run:模拟没有真正同步的操作。
  • --删除已删除:删除不在源目录中的文件。

s4cmd同步[源][目标]

(过时,改用dsync)同步两个目录的内容。目录可以是本地目录,也可以是远程目录,但目前不支持两个本地目录。此命令只需调用get/put/mv命令即可。

  • -r/--recursive:也递归地同步目录。
  • -s/--sync check:检查md5哈希以避免同步相同的内容。
  • -f/--force:覆盖现有文件,而不是显示错误消息。
  • -n/--dry run:模拟没有真正同步的操作。
  • --删除已删除:删除不在源目录中的文件。仅当将本地目录同步到s3目录时有效。

s4cmd cp[源][目标]

将文件或目录从一个s3位置复制到另一个位置。

  • -r/--recursive:也递归地复制目录。
  • -s/--sync check:检查md5哈希以避免复制相同的内容。
  • -f/--force:覆盖现有文件,而不是显示错误消息。
  • -n/--dry run:模拟没有真实副本的操作。

s4cmd mv[源][目标]

将文件或目录从S3位置移到另一个位置。

  • -r/--recursive:也递归地移动目录。
  • -s/--sync check:检查md5哈希以避免移动相同的内容。
  • -f/--force:覆盖现有文件,而不是显示错误消息。
  • -n/--dry run:模拟没有实际移动的操作。

s4cmd del[路径]

删除S3上的文件或目录。

  • -r/--recursive:也递归地删除目录。
  • -n/--dry run:模拟操作而不实际删除。

s4cmd du[路径]

获取给定目录的大小。

可用参数:

  • -r/--recursive:也递归地添加子目录的大小。

S4CMD控制选项

-p s3cfg,--config=[文件名]

S3CFG配置文件的路径

-f,--力

下载或上载时强制覆盖文件

-r,--递归

递归检查子目录

-s,--同步检查

下载或上载前检查文件md5

-n,--干运行

在没有实际下载或上载的情况下试运行

-t重试,--retry=[整数]

放弃前的重试次数

--重试延迟=[整数]

两次重试之间睡眠的秒数

-c num廑threads,--num threads=num廑threads

并发线程数

--端点url

BOTO3客户端中使用的终结点URL

-d,--显示目录

显示目录而不是其内容

--忽略空源

忽略s3中的空源

--使用ssl

(过时)使用到s3的ssl连接

--详细

详细输出

--调试

调试输出

--验证

(过时)验证查找操作

-d,--删除

同步后删除源中不存在的远程文件

--多部分拆分大小=[整数]

分割多部分传输的字节大小

--max singlepart download size=[integer]

大小(字节)大于此值的文件 以多部分传输方式下载

--最大单部件上载大小=[整数]

大小(字节)大于此值的文件 以多部分传输方式上载

--max singlepart copy size=[整数]

大小(字节)大于此值的文件 在多部分传输中复制

--批量删除大小=[整数]

要在批删除中组合的文件数(<;1000)。

--上次修改时间=[datetime]

最后修改日期为的文件的条件 在给定参数之前。

--上次修改时间=[datetime]

最后修改日期为的文件的条件 在给定参数之后。

S3 API传递选项

这些选项直接转换为boto3 api命令。提供的选项将由接受参数的api过滤。例如,--api serversideencryption仅用于put_objectcreate_multipart_upload而不用于list_bucketget_objects例如。因此,为s4cmd ls提供--api服务器端加密没有效果。

有关更多信息,请参见BOTO3 S3文档http://boto3.readthedocs.io/en/latest/reference/services/s3.html

--api-acl=[string]

应用于对象的屏蔽ACL。

--api cachecontrol=[string]

指定请求/回复链上的缓存行为。

--api contentdisposition=[string]

指定对象的表示信息。

--api contentencoding=[字符串]

指定哪些内容编码已应用于对象,因此必须应用哪些解码机制才能获取内容类型头字段引用的媒体类型。

--api contentlanguage=[string]

内容所用的语言。

--api-contentmd5=[字符串]

Base64编码的128位MD5零件数据摘要。

--api contenttype=[string]

描述对象数据格式的标准mime类型。

--api copysourceifmatch=[string]

如果对象的实体标记(ETag)与指定标记匹配,则复制该对象。

--api copysourceifmodifiedsine=[日期时间]

如果对象在指定时间后被修改,则复制该对象。

--api copysourceifnonemach=[string]

如果对象的实体标记(ETag)不同于指定的ETag,则复制该对象。

--api copysourceifunmodifiedsince=[datetime]

如果对象在指定时间后未被修改,则复制该对象。

--api copysourcerange=[string]

要从源对象复制的字节范围。范围值必须使用bytes=first last格式,其中first和last是要复制的基于零的字节偏移量。例如,bytes=0-9表示要复制源的前10个字节。只有当源对象大于5 GB时,才能复制范围。

--api copysourcessecustomeralgorithm=[字符串]

指定解密源对象时要使用的算法(例如,AES256)。

--api-copysourcessecustomerkeymd5=[字符串]

根据rfc 1321指定加密密钥的128位md5摘要。amazon s3使用这个头对en进行消息完整性检查确保加密密钥传输无误。请注意,如果未提供此参数,则会自动填充此参数。不需要包含此参数

--api copysourcessecustomerkey=[字符串]

指定客户提供的用于amazon s3解密源对象的加密密钥。此头中提供的加密密钥必须是创建源对象时使用的密钥。

--api etag=[字符串]

上载部件时返回实体标记。

--api expires=[datetime]

对象不再可缓存的日期和时间。

--api grantfullcontrol=[string]

授予被授予者对对象的读取、读取和写入权限。

--api granteradacp=[string]

允许被授权人读取对象ACL。

--api grantrade=[string]

允许被授权人读取对象数据及其元数据。

--api grantwriteacp=[string]

允许被授权人为适用对象写入ACL。

--api ifmatch=[string]

仅当对象的实体标记(ETag)与指定的标记相同时返回该对象,否则返回412(前提条件失败)。

--api ifmodifiedsine=[datetime]

仅当对象在指定时间之后被修改时才返回该对象,否则返回304(未修改)。

--api ifnonemach=[字符串]

仅当对象的实体标记(ETag)与指定的不同时才返回该对象,否则返回304(未修改)。

--api ifunmodifiedsince=[datetime]

仅当对象在指定时间后未被修改时才返回该对象,否则返回412(前提条件失败)。

--API元数据=[dict]

要与s3中的对象一起存储的元数据映射(json字符串)

--API元数据指令=[string]

指定元数据是从源对象复制还是替换为请求中提供的元数据。

--api-mfa=[字符串]

认证设备的序列号、空格和显示在认证设备上的值的串联。

--api请求方=[string]

确认请求者知道她或他将为此请求收费。bucket所有者无需在其请求中指定此参数。从请求者付费存储桶下载对象的文档可以在http://docs.aws.amazon.com/amazons3/latest/dev/objectsinrequesterpaysbuckets.html" rel="nofollow">http://docs.aws.amazon.com/amazons3/latest/dev/objectsinrequesterpaysbuckets.html

--API服务器端加密=[string]

在S3中存储此对象时使用的服务器端加密算法(例如AES256、AWS:KMS)。

--api ssecustomeralgorithm=[string]

指定加密对象时要使用的算法(例如,AES256)。

--api-ssecustomerkeymd5=[字符串]

根据rfc 1321指定加密密钥的128位md5摘要。amazon s3使用这个报头进行消息完整性检查,以确保加密密钥的传输没有错误。请注意,如果未提供此参数,则会自动填充此参数。不需要包含此参数

--api ssecustomerkey=[string]

指定客户提供的用于amazon s3加密数据的加密密钥。此值用于存储对象,然后将其丢弃;Amazon不存储加密密钥。密钥必须适合与x-amz-server-side-encryption-customer-algorithm头中指定的算法一起使用。

--api ssekmskeyid=[string]

指定用于对象加密的aws kms密钥id。所有人都得到并放回如果不是通过ssl或使用sigv4,aws kms保护的对象的任务将失败。关于配置任何官方支持的aws sdk和cli的文档可以在http://docs.aws.amazon.com/amazons3/latest/dev/usingawssdk.html"中找到/P>

--API存储类=[string]

要用于对象的存储类型。默认为"标准"。

--API版本ID=[string]

versionID用于引用对象的特定版本。

--API网站重定向位置=[string]

如果bucket配置为网站,则将此对象的请求重定向到同一bucket中的另一个对象或外部url。Amazon S3将此头的值存储在对象元数据中。

调试提示

只需启用--debug选项即可查看S4CMD的完整日志。如果您甚至需要检查从s4cmd到boto3调用了哪些api,可以运行:

s4cmd --debug [op] .... 2>&1 >/dev/null | grep S3APICALL

查看发送到s3 api的所有参数。

s3cmd和s4cmd之间的兼容性

前缀匹配:在s3cmd中,不同于传统的文件系统,前缀名匹配列表:

>> s3cmd ls s3://my-bucket/ch
s3://my-bucket/charlie/
s3://my-bucket/chyang/

在s4cmd中,行为与unix shell相同:

>>s4cmd ls s3://my-bucket/ch
>(empty)

要获得前缀行为,请改用显式通配符:s4cmd ls s3://my bucket/ch*

类似地,sync和cp命令模拟unix cp命令,因此 目录同步使用不同的语法:

>> s3cmd sync s3://bucket/path/dirA s3://bucket/path/dirB/

将DIRA中的内容复制到DIRB。

>> s4cmd sync s3://bucket/path/dirA s3://bucket/path/dirB/

将dira复制到dirb中。

要实现s3cmd行为,请使用通配符:

s4cmd sync s3://bucket/path/dirA/* s3://bucket/path/dirB/

注意s4cmd不支持没有尾随斜杠指示dira/*as的dira rsync支持什么。

PUT命令没有自动覆盖: S3CMD PUT FILEA S3://bucket/path/fileb如果fileb存在将返回错误。 使用-f和get命令。

处理不存在路径的错误修复:通常s3cmd会在指定路径不存在时创建空文件: s3cmd get s3://my bucket/no_这样的文件下载一个空文件。 s4cmd get s3://my bucket/no_这样的文件返回一个错误。 s3cmd不放入这样的文件s3://my bucket/uploads一个空文件。 s4cmd put no_这样的文件s3://my bucket/返回一个错误。

附加技术说明

etag、md5和多部分上传:传统上,s3中对象的etag 一直是它的MD5。但是,随着s3多部分的引入,这种情况发生了变化 上载;在本例中,etag仍然是唯一的id,但它不是 文件。亚马逊还没有透露这个案例中etag的定义,所以 我们无法根据 将军。我们使用的解决方法是将md5作为补充内容上传 标题(称为"md5",而不是"etag")。这使得s4cmd能够检查md5 上传或下载前哈希。唯一的限制是这只适用于 通过S4CMD上传的文件。不理解此标题的程序将 仍需直接下载并验证MD5。

未实现的功能

学分

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在springboot mongodata中使用$in运算符   多线程从等待线程Java释放资源   选择的java DropdownChoice与模型值不同,在ajax更新时更改   java在缓存spring中存储值   java在包资源管理器中突出显示文件   java将double[]转换为不可变列表的成本更低的方法   java Joda DateTimeFormat根据默认语言环境切换“MM”和“dd”的位置   ElasticSearch中的java嵌套搜索不起作用?   java SpringBoot@Scheduled Cron表达式在两个任务之间产生轻微延迟?   Spring应用程序中Tomcat mysql连接池的java动态选择目录   未为modal中的前两个字段发送java密钥   java如何在处理过程中使用循环排列打印的数字?i、 从10秒到100秒的e.x和y轴   java如何使用@ManyToMany审核@JoinTable   java如何防止JSESSIONID显示在URL中   JavaSpringSecurity5Always302