针对@Daniel Golden在@tkotisis回答中的评论,看起来AWS CLI工具至少不允许您将项目复制到其自身。但是,您可以通过更新元数据来“强制”复制。
$ aws s3 cp --metadata '{"touched":"now"}' s3://path/to/object s3://path/to/object
这将重新创建对象(将其下载到调用者并重新上传),替换其内容、所有者和元数据。这也会触发任何附加的Lambda事件。
您可以通过复制对象请求实现相同的功能,指定CopySource与目标键相同。
本质上,这将向S3发出PUT Object - COPY请求,其中包含相应的源和目标桶/键。
s3cmd cp s3://path/to/file s3://path/to/file
,其中两个路径相同,会出现以下错误:ERROR: S3 error: 400 (InvalidRequest): This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.
错误表示:此复制请求是非法的,因为它试图将一个对象复制到自身,而不改变对象的元数据、存储类别、网站重定向位置或加密属性。 - Daniel Goldenx-amz-metadata-directive
设置为 REPLACE
? - tkotisisaws s3 cp s3://path/to/file s3://path/to/file --metadata-directive REPLACE
- Chirag Sejpal这里有另一种上传空(或0字节)文件到S3的方法。我已验证其有效性。您也可以使用S3 API上传一个没有正文的文件,就像这样:
aws s3api put-object --bucket "myBucketName" --key "dir-1/my_null_file"
通常您需要指定一个--body
blob,但这个选项只会像预期的那样添加密钥。在S3 API put-object上查看更多信息。
AWS CLI的版本为:aws-cli/2.0.4 Python/3.7.5 Windows/10 botocore/2.0.0dev8
以下是我在PHP中的操作方式(即使在过时的版本5.4中也可以运行,不过我得往回退):
// Init an S3Client
$awsConfig = $app->config('aws');
$aws = Aws::factory($awsConfig);
$s3Bucket = $app->config('S3_Bucket');
$s3Client = $aws->get('s3');
// Set null/empty file.
$result = $s3Client->putObject([
'Bucket' => $s3Bucket,
'Key' => "dir-1/my_null_file",
'Body' => '',
'ServerSideEncryption' => 'AES256',
]);
touch
不应更改文件的内容。它只应在文件存在时更新修改时间,而这将截断现有文件。 - Andrew Pickin我经常在测试中使用“复制小技巧”,甚至我已经将一个方便的函数添加到我的.bashrc文件中:
s3-touch() {
aws s3 cp \
--metadata 'touched=touched' \
--recursive --exclude="*" \
--include="$2" \
"${@:3}" \
"$1" "$1"
}
示例用法:
# will do a dryrun on a copy operation
s3-touch s3://bucket/prefix/ "20200311*" --dryrun
# the real thing, creating events for all objects
# in s3://bucket/prefix/ that start with 20200311
s3-touch s3://bucket/prefix/ "20200311*"
我主要是为了触发S3事件而这样做的。
请查看https://github.com/emdgroup/awscli-s3touch
这是一个插件,可添加touch
命令到AWS CLI中。
用法:
aws s3 touch my-bucket --prefix myfolder/
它通过读取附加到存储桶的事件并在客户端模拟这些事件来工作。
在@g-io简化了我的一天后,这里提供了另一个版本的答案,使得触摸单个文件变得容易。
s3-touch-single() {
aws s3 cp \
--metadata 'touched=touched' \
"${@:3}" \
"$1" "$1"
}
paths=("mydir/image.png" "mydir2/image2.png")
for i in "${paths[@]}"; do s3-touch-single "s3://my-bucket/$i"; done
致命错误:调用HeadObject操作发生错误(404):键“index.html”不存在。
- Chad Johnson