有没有办法触摸() Amazon S3 中的文件?

问题描述 投票:0回答:7

我目前正在使用 Amazon S3,并且正在编写一个使用修改日期的程序。我正在寻找一种编辑修改日期的方法。

我可以循环遍历所有文件并按原样保存它们,但这听起来像是一个糟糕的解决方案。

在 PHP 中有这个函数 touch()

有谁知道解决办法,或者有同样的问题吗?

amazon-s3 metadata last-modified
7个回答
44
投票

回应@Daniel Golden 对@tkotisis 答案的评论。看起来至少 AWS CLI 工具不允许您将项目复制到其自身上。但是,您可以通过更新元数据来“强制”复制。

$ aws s3 cp --metadata '{"touched":"now"}' s3://path/to/object s3://path/to/object

这会重新创建对象(下载到调用者并重新上传),替换其内容、所有者和元数据。这还将触发任何附加的 Lambda 事件。


18
投票

您可以通过 copy object 请求来实现相同的目的,指定 CopySource 与目标键相同。

本质上,这将使用相应的源和目标存储桶/密钥向 S3 发出 PUT 对象 - COPY 请求。


6
投票

我发现自己在测试时经常执行复制技巧,以至于我在 .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 事件。


6
投票

这是将空(或 o 字节)文件上传到 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',
]);

1
投票

查看 https://github.com/emdgroup/awscli-s3touch

它是 AWS CLI 的一个插件,添加了

touch
命令。

用途:

aws s3 touch my-bucket --prefix myfolder/

它的工作原理是读取附加到存储桶的事件并在客户端模拟它们。


1
投票

遵循 @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

0
投票

我知道这已经很旧了,但我刚刚遇到这个并在查看文档之前浪费了一些时间

您可以管道

stdin
并使用
-
来表示
<source>

echo "" | aws s3 cp - s3://bucket-name/filename.txt

来源:https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-copy

© www.soinside.com 2019 - 2024. All rights reserved.