Как удалить несколько файлов в ведро S3 с помощью AWS CLI

Предположим, что у меня есть ведро S3 с именем x.y.z

В этом ковше у меня есть сотни файлов. Но я хочу удалить только 2 файла с именем purple.gif и worksheet.xlsx

Могу ли я сделать это из инструмента командной строки AWS с одним вызовом на rm?

Это не сработало:

$ aws s3 rm s3://x.y.z/worksheet.xlsx s3://x.y.z/purple.gif
Unknown options: s3://x.y.z/purple.gif

Из manual не похоже, что вы можете удалить список файлов явно по имени. Кто-нибудь знает, как это сделать? Я предпочитаю не использовать флаг --recursive.

Ответ 1

Вы не можете использовать s3 rm, но вы можете использовать s3api delete-objects:

aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'

Ответ 2

Вы можете сделать это, указав аргумент --exclude или --include несколько раз. Но для этого вам придется использовать --recursive.

При наличии нескольких фильтров помните, что важен порядок параметров фильтра. Правило состоит в том, что фильтры, которые появляются позже в команде, имеют приоритет над фильтрами, которые появляются ранее в команде.

aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"

Здесь все файлы будут исключены из команды, кроме purple.gif и worksheet.xlsx.

Если вы не уверены, всегда сначала попробуйте --dryrun и проверьте, какие файлы будут удалены.

Источник: Использование фильтров исключения и включения

Ответ 3

ИСПОЛЬЗОВАНИЕ UNIX WILDCARDS С AWS S3 (AWS CLI)

В настоящее время интерфейс командной строки AWS не обеспечивает поддержку подстановочных знаков UNIX в аргументе пути команды. Тем не менее, довольно легко воспроизвести эту функцию с помощью параметров --exclude и --include, доступных в нескольких командах aws s3.

Подстановочные знаки, доступные для использования:

"*" - соответствует всему

"?" - Соответствует любому отдельному символу

"[]" - сопоставляет любой отдельный символ в скобках

"[!]" - сопоставляет любой отдельный символ, не заключенный в скобки

Несколько вещей, которые следует помнить при использовании --include и --exclude с командой aws s3:

Вы можете использовать любое количество параметров --include и --exclude.

Параметры, переданные позже, имеют приоритет над параметрами, переданными ранее (в той же команде).

Все файлы и объекты по умолчанию включены включены', поэтому для включения только определенных файлов необходимо использовать "исключить", а затем "включить". --recursive должен использоваться вместе с --include и --exclude, иначе команды будут выполнять только операции с одним файлом/объектом.

Примеры: Скопируйте все файлы из рабочего каталога в корзину больших данных:

aws s3 cp ./ s3://big-datums/ --recursive

Удалите все файлы ".java" из корзины больших данных:

aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.java"

Удалите все файлы в области больших данных с расширением файла с "j" или "c" (".csv", ".java,".json ",." jpeg "и т.д.):

aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.[jc]*"

Скопируйте файлы ".txt" и ".csv" из большой базы данных S3 в локальный рабочий каталог:

aws s3 cp s3://big-datums/ . --recursive --exclude "*" --include "*.txt" --include "*.csv"

#Copy all files from working directory to the big-datums bucket:
aws s3 cp ./ s3://big-datums/ --recursive

#Delete all ".java" files from the big-datums bucket:
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.java"

#Delete all files in the big-datums bucket with a file extension beginning with "j" or "c" (".csv", ".java, ".json", ."jpeg", etc.):
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.[jc]*"

#Copy ".txt" and ".csv" files from big-datums S3 bucket to local working directory:
aws s3 cp s3://big-datums/ . --recursive --exclude "*" --include "*.txt" --include "*.csv" '''

Ответ 4

Я нашел это полезным в командной строке. У меня было более 4 миллионов файлов, и для освобождения ведра потребовалось почти неделю. Это удобно, поскольку консоль AWS не описана в журналах.

Примечание. Вам необходимо установить jquery

 aws s3api list-object-versions --bucket YOUrBUCKEtNAMeHERe-processed --output json --query 'Versions[].[Key, VersionId]' | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' | xargs -L1 aws s3api delete-object --bucket YOUrBUCKEtNAMeHERe

Ответ 5

Заметить, что:

aws s3 rm s3://xyz / --recursive --include "\*.gif" удаляет все файлы в пути, включая "\*.gif"

aws s3 rm s3://xyz / --recursive --exclude "\*" --include "\*.gif" удаляет только файлы, соответствующие "\*.gif"

Ответ 6

По-видимому, aws s3 rm работает только с отдельными файлами/объектами.

Ниже приведена команда bash, которая работает с некоторым успехом (немного медленно, но работает):

aws s3 ls s3://bucketname/foldername/ | 
awk {'print "aws s3 rm s3://bucketname/foldername/" $4'} | 
bash

Обратите внимание, что у вас могут возникнуть проблемы, если в именах ваших объектов есть пробелы или забавные символы. Это потому, что команда "aws s3 ls" не будет перечислять такие объекты.

Ответ 7

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

aws s3 ls dmap-live-dwh-files/backup/mongodb/oms_api/hourly/ | grep order_2019_08_09_* | awk {'print "aws s3 rm s3://dmap-live-dwh-files/backup/mongodb/oms_api/hourly/" $4'} | bash 

Ответ 8

Если вы используете AWS CLI, вы можете отфильтровать результаты LS с помощью grep regex и удалить их. Например,

aws s3 ls s3://BUCKET | awk '{print $4}' | grep -E -i '^2015-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9][0-9])\-([0-9a-zA-Z]*)' | xargs -I% bash -c 'aws s3 rm s3://BUCKET/%'

Это медленно, но работает