重复的 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
我有一个 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