{ "info": { "author": "Chou-han Yang", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "# s4cmd\n### Super S3 command line tool\n[![Build Status](https://travis-ci.com/bloomreach/s4cmd.svg?branch=master)](https://travis-ci.com/bloomreach/s4cmd) [![Join the chat at https://gitter.im/bloomreach/ s4cmd](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/bloomreach/s4cmd?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n----\n\n**Author**: Chou-han Yang ([@chouhanyang](https://github.com/chouhanyang))\n\n**Current Maintainers**: Naveen Vardhi ([@rozuur](https://github.com/rozuur)) | Navin Pai ([@navinpai](https://github.com/navinpai))\n\n----\n\n## What's New in s4cmd 2.x\n\n- Fully migrated from old boto 2.x to new [boto3](http://boto3.readthedocs.io/en/latest/reference/services/s3.html) library, which provides more reliable and up-to-date S3 backend.\n- Support S3 `--API-ServerSideEncryption` along with **36 new API pass-through options**. See API pass-through options section for complete list.\n- Support batch delete (with delete_objects API) to delete up to 1000 files with single call. **100+ times faster** than sequential deletion.\n- Support `S4CMD_OPTS` environment variable for commonly used options such as `--API-ServerSideEncryption` across all your s4cmd operations.\n- Support moving files **larger than 5GB** with multipart upload. **20+ times faster** then sequential move operation when moving large files.\n- Support timestamp filtering with `--last-modified-before` and `--last-modified-after` options for all operations. Human friendly timestamps are supported, e.g. `--last-modified-before='2 months ago'`\n- Faster upload with lazy evaluation of md5 hash.\n- Listing large number of files with S3 pagination, with memory is the limit.\n- New directory to directory `dsync` command is better and standalone implementation to replace old `sync` command, which is implemented based on top of get/put/mv commands. `--delete-removed` work for all cases including local to s3, s3 to local, and s3 to s3. `sync` command preserves the old behavior in this version for compatibility.\n- Tested on both python 2 and 3.\n- Special thanks to [onera.com](http://www.onera.com) for supporting s4cmd.\n\n\n## Motivation\n\nS4cmd is a command-line utility for accessing\n[Amazon S3](http://en.wikipedia.org/wiki/Amazon_S3), inspired by\n[s3cmd](http://s3tools.org/s3cmd).\n\nWe have used s3cmd heavily for a number of scripted, data-intensive\napplications. However as the need for a variety of small improvements arose, we\ncreated our own implementation, s4cmd. It is intended as an alternative to\ns3cmd for enhanced performance and for large files, and with a number of\nadditional features and fixes that we have found useful.\n\nIt strives to be compatible with the most common usage scenarios for s3cmd. It\ndoes not offer exact drop-in compatibility, due to a number of corner cases where\ndifferent behavior seems preferable, or for bugfixes.\n\n\n## Features\n\nS4cmd supports the regular commands you might expect for fetching and storing\nfiles in S3: `ls`, `put`, `get`, `cp`, `mv`, `sync`, `del`, `du`.\n\nThe main features that distinguish s4cmd are:\n\n- Simple (less than 1500 lines of code) and implemented in pure Python, based\n on the widely used [Boto3](https://github.com/boto/boto3) library.\n- Multi-threaded/multi-connection implementation for enhanced performance on all\n commands. As with many network-intensive applications (like web browsers),\n accessing S3 in a single-threaded way is often significantly less efficient than\n having multiple connections actively transferring data at once. In general, we\n get a 2X boost to upload/download speeds from this.\n- Path handling: S3 is not a traditional filesystem with built-in support for\n directory structure: internally, there are only objects, not directories or\n folders. However, most people use S3 in a hierarchical structure, with paths\n separated by slashes, to emulate traditional filesystems. S4cmd follows\n conventions to more closely replicate the behavior of traditional filesystems\n in certain corner cases. For example, \"ls\" and \"cp\" work much like in Unix\n shells, to avoid odd surprises. (For examples see compatibility notes below.)\n- Wildcard support: Wildcards, including multiple levels of wildcards, like in\n Unix shells, are handled. For example:\n s3://my-bucket/my-folder/20120512/*/*chunk00?1?\n- Automatic retry: Failure tasks will be executed again after a delay.\n- Multi-part upload support for files larger than 5GB.\n- Handling of MD5s properly with respect to multi-part uploads (for the sordid\n details of this, see below).\n- Miscellaneous enhancements and bugfixes:\n - Partial file creation: Avoid creating empty target files if source does not\n exist. Avoid creating partial output files when commands are interrupted.\n - General thread safety: Tool can be interrupted or killed at any time without\n being blocked by child threads or leaving incomplete or corrupt files in\n place.\n - Ensure exit code is nonzero on all failure scenarios (a very important\n feature in scripts).\n - Expected handling of symlinks (they are followed).\n - Support both `s3://` and `s3n://` prefixes (the latter is common with\n Amazon Elastic Mapreduce).\n\nLimitations:\n\n- No CloudFront or other feature support.\n- Currently, we simulate `sync` with `get` and `put` with `--recursive --force --sync-check`.\n\n\n## Installation and Setup\nYou can install `s4cmd` [PyPI](https://pypi.python.org/pypi/s4cmd).\n\n```\npip install s4cmd\n```\n\n- Copy or create a symbolic link so you can run `s4cmd.py` as `s4cmd`. (It is just\na single file!)\n- If you already have a `~/.s3cfg` file from configuring `s3cmd`, credentials\nfrom this file will be used. Otherwise, set the `S3_ACCESS_KEY` and\n`S3_SECRET_KEY` environment variables to contain your S3 credentials.\n- If no keys are provided, but an IAM role is associated with the EC2 instance, it will\nbe used transparently.\n\n\n## s4cmd Commands\n\n#### `s4cmd ls [path]`\n\nList all contents of a directory.\n\n* -r/--recursive: recursively display all contents including subdirectories under the given path.\n* -d/--show-directory: show the directory entry instead of its content.\n\n\n#### `s4cmd put [source] [target]`\n\nUpload local files up to S3.\n\n* -r/--recursive: also upload directories recursively.\n* -s/--sync-check: check md5 hash to avoid uploading the same content.\n* -f/--force: override existing file instead of showing error message.\n* -n/--dry-run: emulate the operation without real upload.\n\n#### `s4cmd get [source] [target]`\n\nDownload files from S3 to local filesystem.\n\n* -r/--recursive: also download directories recursively.\n* -s/--sync-check: check md5 hash to avoid downloading the same content.\n* -f/--force: override existing file instead of showing error message.\n* -n/--dry-run: emulate the operation without real download.\n\n\n#### `s4cmd dsync [source dir] [target dir]`\n\nSynchronize the contents of two directories. The directory can either be local or remote, but currently, it doesn't support two local directories.\n\n* -r/--recursive: also sync directories recursively.\n* -s/--sync-check: check md5 hash to avoid syncing the same content.\n* -f/--force: override existing file instead of showing error message.\n* -n/--dry-run: emulate the operation without real sync.\n* --delete-removed: delete files not in source directory.\n\n#### `s4cmd sync [source] [target]`\n\n(Obsolete, use `dsync` instead) Synchronize the contents of two directories. The directory can either be local or remote, but currently, it doesn't support two local directories. This command simply invoke get/put/mv commands.\n\n* -r/--recursive: also sync directories recursively.\n* -s/--sync-check: check md5 hash to avoid syncing the same content.\n* -f/--force: override existing file instead of showing error message.\n* -n/--dry-run: emulate the operation without real sync.\n* --delete-removed: delete files not in source directory. Only works when syncing local directory to s3 directory.\n\n#### `s4cmd cp [source] [target]`\n\nCopy a file or a directory from a S3 location to another.\n\n* -r/--recursive: also copy directories recursively.\n* -s/--sync-check: check md5 hash to avoid copying the same content.\n* -f/--force: override existing file instead of showing error message.\n* -n/--dry-run: emulate the operation without real copy.\n\n#### `s4cmd mv [source] [target]`\n\nMove a file or a directory from a S3 location to another.\n\n* -r/--recursive: also move directories recursively.\n* -s/--sync-check: check md5 hash to avoid moving the same content.\n* -f/--force: override existing file instead of showing error message.\n* -n/--dry-run: emulate the operation without real move.\n\n#### `s4cmd del [path]`\n\nDelete files or directories on S3.\n\n* -r/--recursive: also delete directories recursively.\n* -n/--dry-run: emulate the operation without real delete.\n\n#### `s4cmd du [path]`\n\nGet the size of the given directory.\n\nAvailable parameters:\n\n* -r/--recursive: also add sizes of sub-directories recursively.\n\n## s4cmd Control Options\n\n##### `-p S3CFG, --config=[filename]`\npath to s3cfg config file\n\n##### `-f, --force`\nforce overwrite files when download or upload\n\n##### `-r, --recursive`\nrecursively checking subdirectories\n\n##### `-s, --sync-check`\ncheck file md5 before download or upload\n\n##### `-n, --dry-run`\ntrial run without actual download or upload\n\n##### `-t RETRY, --retry=[integer]`\nnumber of retries before giving up\n\n##### `--retry-delay=[integer]`\nseconds to sleep between retries\n\n##### `-c NUM_THREADS, --num-threads=NUM_THREADS`\nnumber of concurrent threads\n\n##### `--endpoint-url`\nendpoint url used in boto3 client\n\n##### `-d, --show-directory`\nshow directory instead of its content\n\n##### `--ignore-empty-source`\nignore empty source from s3\n\n##### `--use-ssl`\n(obsolete) use SSL connection to S3\n\n##### `--verbose`\nverbose output\n\n##### `--debug`\ndebug output\n\n##### `--validate`\n(obsolete) validate lookup operation\n\n##### `-D, --delete-removed`\ndelete remote files that do not exist in source after sync\n\n##### `--multipart-split-size=[integer]`\nsize in bytes to split multipart transfers\n\n##### `--max-singlepart-download-size=[integer]`\nfiles with size (in bytes) greater than this will be\ndownloaded in multipart transfers\n\n##### `--max-singlepart-upload-size=[integer]`\nfiles with size (in bytes) greater than this will be\nuploaded in multipart transfers\n\n##### `--max-singlepart-copy-size=[integer]`\nfiles with size (in bytes) greater than this will be\ncopied in multipart transfers\n\n##### `--batch-delete-size=[integer]`\nNumber of files (<1000) to be combined in batch delete.\n\n##### `--last-modified-before=[datetime]`\nCondition on files where their last modified dates are\nbefore given parameter.\n\n##### `--last-modified-after=[datetime]`\nCondition on files where their last modified dates are\nafter given parameter.\n\n\n## S3 API Pass-through Options\n\nThose options are directly translated to boto3 API commands. The options provided will be filtered by the APIs that are taking parameters. For example, `--API-ServerSideEncryption` is only needed for `put_object`, `create_multipart_upload` but not for `list_buckets` and `get_objects` for example. Therefore, providing `--API-ServerSideEncryption` for `s4cmd ls` has no effect.\n\nFor more information, please see boto3 s3 documentations http://boto3.readthedocs.io/en/latest/reference/services/s3.html\n\n##### `--API-ACL=[string]`\nThe canned ACL to apply to the object.\n\n##### `--API-CacheControl=[string]`\nSpecifies caching behavior along the request/reply chain.\n\n##### `--API-ContentDisposition=[string]`\nSpecifies presentational information for the object.\n\n##### `--API-ContentEncoding=[string]`\nSpecifies what content encodings have been applied to the object and thus what decoding mechanisms must be applied to obtain the media-type referenced by the Content-Type header field.\n\n##### `--API-ContentLanguage=[string]`\nThe language the content is in.\n\n##### `--API-ContentMD5=[string]`\nThe base64-encoded 128-bit MD5 digest of the part data.\n\n##### `--API-ContentType=[string]`\nA standard MIME type describing the format of the object data.\n\n##### `--API-CopySourceIfMatch=[string]`\nCopies the object if its entity tag (ETag) matches the specified tag.\n\n##### `--API-CopySourceIfModifiedSince=[datetime]`\nCopies the object if it has been modified since the specified time.\n\n##### `--API-CopySourceIfNoneMatch=[string]`\nCopies the object if its entity tag (ETag) is different than the specified ETag.\n\n##### `--API-CopySourceIfUnmodifiedSince=[datetime]`\nCopies the object if it hasn't been modified since the specified time.\n\n##### `--API-CopySourceRange=[string]`\nThe range of bytes to copy from the source object. The range value must use the form bytes=first-last, where the first and last are the zero-based byte offsets to copy. For example, bytes=0-9 indicates that you want to copy the first ten bytes of the source. You can copy a range only if the source object is greater than 5 GB.\n\n##### `--API-CopySourceSSECustomerAlgorithm=[string]`\nSpecifies the algorithm to use when decrypting the source object (e.g., AES256).\n\n##### `--API-CopySourceSSECustomerKeyMD5=[string]`\nSpecifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header for a message integrity check to ensure the encryption key was transmitted without error. Please note that this parameter is automatically populated if it is not provided. Including this parameter is not required\n\n##### `--API-CopySourceSSECustomerKey=[string]`\nSpecifies the customer-provided encryption key for Amazon S3 to use to decrypt the source object. The encryption key provided in this header must be one that was used when the source object was created.\n\n##### `--API-ETag=[string]`\nEntity tag returned when the part was uploaded.\n\n##### `--API-Expires=[datetime]`\nThe date and time at which the object is no longer cacheable.\n\n##### `--API-GrantFullControl=[string]`\nGives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object.\n\n##### `--API-GrantReadACP=[string]`\nAllows grantee to read the object ACL.\n\n##### `--API-GrantRead=[string]`\nAllows grantee to read the object data and its metadata.\n\n##### `--API-GrantWriteACP=[string]`\nAllows grantee to write the ACL for the applicable object.\n\n##### `--API-IfMatch=[string]`\nReturn the object only if its entity tag (ETag) is the same as the one specified, otherwise return a 412 (precondition failed).\n\n##### `--API-IfModifiedSince=[datetime]`\nReturn the object only if it has been modified since the specified time, otherwise return a 304 (not modified).\n\n##### `--API-IfNoneMatch=[string]`\nReturn the object only if its entity tag (ETag) is different from the one specified, otherwise return a 304 (not modified).\n\n##### `--API-IfUnmodifiedSince=[datetime]`\nReturn the object only if it has not been modified since the specified time, otherwise return a 412 (precondition failed).\n\n##### `--API-Metadata=[dict]`\nA map (in json string) of metadata to store with the object in S3\n\n##### `--API-MetadataDirective=[string]`\nSpecifies whether the metadata is copied from the source object or replaced with metadata provided in the request.\n\n##### `--API-MFA=[string]`\nThe concatenation of the authentication device's serial number, a space, and the value that is displayed on your authentication device.\n\n##### `--API-RequestPayer=[string]`\nConfirms that the requester knows that she or he will be charged for the request. Bucket owners need not specify this parameter in their requests. Documentation on downloading objects from requester pays buckets can be found at http://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\n\n##### `--API-ServerSideEncryption=[string]`\nThe Server-side encryption algorithm used when storing this object in S3 (e.g., AES256, aws:kms).\n\n##### `--API-SSECustomerAlgorithm=[string]`\nSpecifies the algorithm to use to when encrypting the object (e.g., AES256).\n\n##### `--API-SSECustomerKeyMD5=[string]`\nSpecifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header for a message integrity check to ensure the encryption key was transmitted without error. Please note that this parameter is automatically populated if it is not provided. Including this parameter is not required\n\n##### `--API-SSECustomerKey=[string]`\nSpecifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is used to store the object and then it is discarded; Amazon does not store the encryption key. The key must be appropriate for use with the algorithm specified in the x-amz-server-side-encryption-customer-algorithm header.\n\n##### `--API-SSEKMSKeyId=[string]`\nSpecifies the AWS KMS key ID to use for object encryption. All GET and PUT requests for an object protected by AWS KMS will fail if not made via SSL or using SigV4. Documentation on configuring any of the officially supported AWS SDKs and CLI can be found at http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version\n\n##### `--API-StorageClass=[string]`\nThe type of storage to use for the object. Defaults to 'STANDARD'.\n\n##### `--API-VersionId=[string]`\nVersionId used to reference a specific version of the object.\n\n##### `--API-WebsiteRedirectLocation=[string]`\nIf the bucket is configured as a website, redirects requests for this object to another object in the same bucket or to an external URL. Amazon S3 stores the value of this header in the object metadata.\n\n\n## Debugging Tips\n\nSimply enable `--debug` option to see the full log of s4cmd. If you even need to check what APIs are invoked from s4cmd to boto3, you can run:\n\n```\ns4cmd --debug [op] .... 2>&1 >/dev/null | grep S3APICALL\n```\n\nTo see all the parameters sending to S3 API.\n\n\n## Compatibility between s3cmd and s4cmd\n\nPrefix matching: In s3cmd, unlike traditional filesystems, prefix names match listings:\n\n```\n>> s3cmd ls s3://my-bucket/ch\ns3://my-bucket/charlie/\ns3://my-bucket/chyang/\n```\n\nIn s4cmd, behavior is the same as with a Unix shell:\n\n```\n>>s4cmd ls s3://my-bucket/ch\n>(empty)\n```\n\nTo get prefix behavior, use explicit wildcards instead: s4cmd ls s3://my-bucket/ch*\n\nSimilarly, sync and cp commands emulate the Unix cp command, so directory to\ndirectory sync use different syntax:\n\n```\n>> s3cmd sync s3://bucket/path/dirA s3://bucket/path/dirB/\n```\nwill copy contents in dirA to dirB.\n```\n>> s4cmd sync s3://bucket/path/dirA s3://bucket/path/dirB/\n```\nwill copy dirA *into* dirB.\n\nTo achieve the s3cmd behavior, use wildcards:\n```\ns4cmd sync s3://bucket/path/dirA/* s3://bucket/path/dirB/\n```\n\nNote s4cmd doesn't support dirA without trailing slash indicating dirA/* as\nwhat rsync supported.\n\nNo automatic override for put command:\ns3cmd put fileA s3://bucket/path/fileB will return error if fileB exists.\nUse -f as well as get command.\n\nBugfixes for handling of non-existent paths: Often s3cmd creates empty files when specified paths do not exist:\ns3cmd get s3://my-bucket/no_such_file downloads an empty file.\ns4cmd get s3://my-bucket/no_such_file returns an error.\ns3cmd put no_such_file s3://my-bucket/ uploads an empty file.\ns4cmd put no_such_file s3://my-bucket/ returns an error.\n\n\n## Additional technical notes\n\nEtags, MD5s and multi-part uploads: Traditionally, the etag of an object in S3\nhas been its MD5. However, this changed with the introduction of S3 multi-part\nuploads; in this case the etag is still a unique ID, but it is not the MD5 of\nthe file. Amazon has not revealed the definition of the etag in this case, so\nthere is no way we can calculate and compare MD5s based on the etag header in\ngeneral. The workaround we use is to upload the MD5 as a supplemental content\nheader (called \"md5\", instead of \"etag\"). This enables s4cmd to check the MD5\nhash before upload or download. The only limitation is that this only works for\nfiles uploaded via s4cmd. Programs that do not understand this header will\nstill have to download and verify the MD5 directly.\n\n\n## Unimplemented features\n\n- CloudFront or other feature support beyond basic S3 access.\n\n## Credits\n\n* Bloomreach http://www.bloomreach.com\n* Onera http://www.onera.com", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bloomreach/s4cmd", "keywords": "", "license": "http://www.apache.org/licenses/LICENSE-2.0", "maintainer": "", "maintainer_email": "", "name": "s4cmd", "package_url": "https://pypi.org/project/s4cmd/", "platform": "", "project_url": "https://pypi.org/project/s4cmd/", "project_urls": { "Homepage": "https://github.com/bloomreach/s4cmd" }, "release_url": "https://pypi.org/project/s4cmd/2.1.0/", "requires_dist": null, "requires_python": "", "summary": "Super S3 command line tool", "version": "2.1.0" }, "last_serial": 4167185, "releases": { "1.5.19": [ { "comment_text": "", "digests": { "md5": "ae7d4eed5aa2e830a6e20c111071c76e", "sha256": "a14e1d859b8ae680693e7a1c1d479ba1078adc05ff435295b5e30aaebed58dbf" }, "downloads": -1, "filename": "s4cmd-1.5.19.tar.gz", "has_sig": false, "md5_digest": "ae7d4eed5aa2e830a6e20c111071c76e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15333, "upload_time": "2014-09-04T22:35:12", "url": "https://files.pythonhosted.org/packages/86/70/1e2d0cda5f207c45b5cfba0e307ec65d116b5094e9548dd7ae8bf71fa81d/s4cmd-1.5.19.tar.gz" }, { "comment_text": "", "digests": { "md5": "efdea7ad19927ce629b943236355c4e9", "sha256": "3013bc78cadf6f50e20375af5d75edaf91b7d9f03a78d78b3c71289186767e75" }, "downloads": -1, "filename": "s4cmd-1.5.20.tar.gz", "has_sig": false, "md5_digest": "efdea7ad19927ce629b943236355c4e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25527, "upload_time": "2015-02-18T22:12:40", "url": "https://files.pythonhosted.org/packages/e7/3b/e4dce078286a00d3dd90a9ef59d2d17400196e7e704a00e62d8f39d6d66c/s4cmd-1.5.20.tar.gz" } ], "1.5.20": [], "2.0.0": [ { "comment_text": "", "digests": { "md5": "70c30eb59c2a77a1f3a9776f16a86d79", "sha256": "19b498b95c6e88e1713e4ebc95554634d6b59071a289b4edfea4ce00ea848cec" }, "downloads": -1, "filename": "s4cmd-2.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "70c30eb59c2a77a1f3a9776f16a86d79", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 147597, "upload_time": "2016-05-12T00:17:49", "url": "https://files.pythonhosted.org/packages/84/d3/1833c8b2c5ccffc421617b180d83a444a6882552a5907706f13c8b72baa3/s4cmd-2.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bf503ec7e4ce4988ef73a3d2c744c4d3", "sha256": "2166d819d4ebf8ffd1d442f67efffc877f721e670de29d335b3065394d2c656d" }, "downloads": -1, "filename": "s4cmd-2.0.0.tar.gz", "has_sig": false, "md5_digest": "bf503ec7e4ce4988ef73a3d2c744c4d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21212, "upload_time": "2016-05-12T00:17:12", "url": "https://files.pythonhosted.org/packages/fd/19/67e763f6d75a9d88708ea16a8d9b05131a7c4918ff2c81c4311be48cb503/s4cmd-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "68a566e0fae997e7d4bc6933b1c58deb", "sha256": "c95659da0d2bfcd6222e9628d059810c249bd667c391500804d2bcdeeb6b8a14" }, "downloads": -1, "filename": "s4cmd-2.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "68a566e0fae997e7d4bc6933b1c58deb", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 149427, "upload_time": "2016-05-16T10:06:50", "url": "https://files.pythonhosted.org/packages/d2/cd/6a7be0d744aa13b3acdc9711f6464d5ad9d5bfe5619f550b6058d6a7e22d/s4cmd-2.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2e83074531dedb22748cb9602f5c3de8", "sha256": "e64bc965e240d56440e55f8be1514af679fd6f6e49b43ffac03aa84ea4bdee91" }, "downloads": -1, "filename": "s4cmd-2.0.1.tar.gz", "has_sig": false, "md5_digest": "2e83074531dedb22748cb9602f5c3de8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21412, "upload_time": "2016-05-16T10:06:26", "url": "https://files.pythonhosted.org/packages/f4/ae/ae50df9008a2df2acb0a2c8b56a68f9da50d2129f48140af03564c61649a/s4cmd-2.0.1.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "ae67774b01f02b2868aa4596d3d4b676", "sha256": "42566058a74d3e1e553351966efaaffa08e4b6ac28a19e72a51be21151ea9534" }, "downloads": -1, "filename": "s4cmd-2.1.0.tar.gz", "has_sig": false, "md5_digest": "ae67774b01f02b2868aa4596d3d4b676", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27534, "upload_time": "2018-08-13T22:59:41", "url": "https://files.pythonhosted.org/packages/42/b4/0061f4930958cd790098738659c1c39f8feaf688e698142435eedaa4ae34/s4cmd-2.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ae67774b01f02b2868aa4596d3d4b676", "sha256": "42566058a74d3e1e553351966efaaffa08e4b6ac28a19e72a51be21151ea9534" }, "downloads": -1, "filename": "s4cmd-2.1.0.tar.gz", "has_sig": false, "md5_digest": "ae67774b01f02b2868aa4596d3d4b676", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27534, "upload_time": "2018-08-13T22:59:41", "url": "https://files.pythonhosted.org/packages/42/b4/0061f4930958cd790098738659c1c39f8feaf688e698142435eedaa4ae34/s4cmd-2.1.0.tar.gz" } ] }