重复的 AWS S3 文件仅在对象 URL 末尾有一个回车符 return 不同

Duplicate AWS S3 files differing only by a carriage return at the end of the Object URL

我有一个 S3 存储桶几乎 个重复文件:

如果我 运行 AWS CLI,我得到相同的文件路径,只有几个字节不同:

2021-09-23 16:36:36     134626 Original/53866358.xml
2021-09-23 16:36:36     134675 Original/53866358.xml

如果我查看各个对象页面,它们都有相同的键:

唯一的区别是它的对象 URL 末尾有 %0D(ASCII 运输 return)。据推测,这是更大的文件。我的问题是:如何使用 AWS S3 CLI 获得对每一个的唯一引用?我想把最后有回车-return的删掉

这是一个有趣的问题,只是为了奠定我的解决方案如何提供帮助的基础,我用一个简单的 python 脚本重新创建了这个问题:

import boto3
s3 = boto3.client('s3')
s3.put_object(Bucket='example-bucket', Key='temp/key', Body=b'normal key')
s3.put_object(Bucket='example-bucket', Key='temp/key\r', Body=b'this is not the normal key')

从那里,您可以看到您描述的问题:

$ aws s3 ls s3://example-bucket/temp/
2021-12-03 20:14:45         10 key
2021-12-03 20:14:45         26 key

您可以使用 cli 列出包含更多详细信息的对象(一些详细信息已从此处的输出中删除):

$ aws s3api list-objects --bucket example-bucket --prefix temp/
{
    "Contents": [
        {
            "Key": "temp/key",
            "Size": 10
        },
        {
            "Key": "temp/key\r",
            "Size": 26
        }
    ]
}

要删除键名中带有 CR 的对象,脚本最简单,但您可以使用 CLI 删除它,只是语法有点笨拙:

## If you're using Unix or Mac
$ aws s3api delete-object --cli-input-json '{"Bucket": "example-bucket", "Key": "temp/key\r"}'

## If you're using Windows:
C:> aws s3api delete-object --cli-input-json "{""Bucket"": ""example-bucket"", ""
Key"": ""temp/key\r""}"

请注意引用 JSON 对象所需的语法,并转义 Windows 上的引号。

从那里开始,很容易验证它是否按预期工作:

$ aws s3 ls s3://example-bucket/temp/
2021-12-03 20:14:45         10 key

$ aws s3 cp s3://example-bucket/temp/key final_check.txt
download: s3://example-bucket/temp/key to ./final_check.txt

$ type final_check.txt
normal key