S3 удалять файл программно, который заканчивается в строке (% 0A)?

109
14

У меня есть куча файлов в s3, которые отображаются в консоли как заканчивающиеся на "% 0A". Я хотел бы программно удалить эти файлы.

Когда я использую этот метод и устанавливаю ключ с суффиксом "% 0A", я не получаю ошибки, но файл не удаляется.

Я не знаю, как это выглядело, когда файл был изначально написан.

спросил(а) 2018-09-07T23:49:00+03:00 2 года, 1 месяц назад
1
Решение
70

Консоль S3 должна иметь возможность удалять ее независимо от того, какие символы она содержит или как она сломана (если мы говорим об одном и том же). У вас достаточно разрешений?

Когда вы делаете это по-другому, сначала вам нужно выяснить, действительно ли "% 0A" является частью имени или является символом LF с кодировкой url ("\n"). Имейте в виду, что вы можете не видеть других непечатаемых символов. Лучший способ определить это - открыть его в Amazon Console, выбрать S3 в меню Сервис, найти свой Bucket и нажать на ваш файл, отметить объект Link.

Если "% 0A" является частью имени, вы увидите имя объекта как "foo% 0A", но в ссылке он будет выглядеть как "foo% 250A". В этом случае s3 rm s3://BUCKET/foo%0A должен сделать трюк.

Если "% 0A" обозначает символ "\n", закодированный url, тогда вы должны увидеть имя объекта (только над вкладками) как "foo", но увидите "foo% 0A" в качестве имени объекта в URL-адресе. В этом случае вам нужно внедрить новую строку в ключ при выдаче команды s3 rm. Это зависит от вашей операционной системы. Например, в linux/unix вы вводите его следующим образом:

aws-cli s3 rm 's3://BUCKET/foo
'

Обратите внимание на цитаты и что закрывающая цитата находится в начале новой строки. Это сделает новую строку частью значения, переданного в качестве параметра командной строки.

Также обратите внимание, что aws-cli может быть вызван просто aws в какой-либо системе, но если вы предоставили команду s3 rm в качестве примера, я предполагаю, что вы уже знаете, что именно в вашей системе. И если вы используете PowerShell в Windows, используйте обратную ссылку вместо котировок.

Теперь проверьте объект Link и посмотрите, что там есть другие символы. Глядя на ваши примеры и проблемы, о которых вы сообщаете, я подозреваю, что в именах файлов больше одного. Важным моментом здесь является то, что имя вашего объекта может содержать больше непечатаемых символов, и вы не увидите его в консоли S3, но ссылка будет включать все их в кодированную URL-форму. Таким образом, вы можете извлечь фактическое точное имя из ссылки. Обратите внимание, что оба aws-cli и связанный с ними программный интерфейс принимают фактическое имя, а не кодировку url. Итак, если вы используете aws-cli, вам нужно встроить все непечатаемые символы в параметр командной строки. И если вы используете программный интерфейс, вам нужно встроить их в строку ключа, которую вы передаете для вызова (например, вместо "новой строки" вместо "\n"). Хотя я считаю эту часть довольно очевидной. И верьте, что вы будете знать, что делать, когда увидите свое фактическое имя файла со всеми непечатаемыми в нем.

ответил(а) 2018-09-13T14:43:00+03:00 2 года, 1 месяц назад
41

Попробуй это

 aws s3 rm "bucket_name"$'\r' --recursive

Работал на меня.

ответил(а) 2019-05-16T08:39:00+03:00 1 год, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема