Дубликаты файлов AWS S3, отличающиеся только возвратом каретки в конце URL-адреса объекта

#amazon-web-services #amazon-s3 #aws-cli

Вопрос:

У меня есть корзина S3 с почти дубликатами файлов:

введите описание изображения здесь

Если я запускаю интерфейс командной строки AWS, я получаю одни и те же пути к файлам, отличающиеся всего на несколько байтов:

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

Если я посмотрю на отдельные страницы объектов, у обоих будет один и тот же ключ:

введите описание изображения здесь

введите описание изображения здесь

Единственное отличие состоит в том, что
в конце URL-адреса объекта есть (возврат каретки ASCII). Предположительно, это файл большего размера. Мой вопрос: Как я могу получить уникальную ссылку на каждый из них, используя интерфейс командной строки AWS S3? Я бы хотел удалить те, у которых в конце есть возврат каретки.

Комментарии:

1. Разве вы не можете просто удалить его в консоли управления S3?

Ответ №1:

Это интересная проблема, просто чтобы заложить основу того, как мое решение поможет, я воссоздал проблему с помощью простого скрипта 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/keyr', 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  

Вы можете перечислить объекты с более подробной информацией, используя интерфейс командной строки (некоторые сведения были удалены из вывода здесь).:

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

Чтобы удалить объект с CR в имени ключа, проще всего использовать скрипт, но вы можете удалить его с помощью интерфейса командной строки, просто с несколько неудобным синтаксисом:

 ## If you're using Unix or Mac $ aws s3api delete-object --cli-input-json '{"Bucket": "example-bucket", "Key": "temp/keyr"}'  ## If you're using Windows: C:gt; aws s3api delete-object --cli-input-json "{""Bucket"": ""example-bucket"", "" Key"": ""temp/keyr""}"  

Обратите внимание, что требуется синтаксис для цитирования объекта 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