Ответ 1
Вы не можете использовать s3 rm
, но вы можете использовать s3api delete-objects
:
aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
Предположим, что у меня есть ведро 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
.
Вы не можете использовать s3 rm
, но вы можете использовать s3api delete-objects
:
aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
Вы можете сделать это, указав аргумент --exclude
или --include
несколько раз. Но для этого вам придется использовать --recursive
.
При наличии нескольких фильтров помните, что важен порядок параметров фильтра. Правило состоит в том, что фильтры, которые появляются позже в команде, имеют приоритет над фильтрами, которые появляются ранее в команде.
aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"
Здесь все файлы будут исключены из команды, кроме purple.gif и worksheet.xlsx.
Если вы не уверены, всегда сначала попробуйте --dryrun
и проверьте, какие файлы будут удалены.
ИСПОЛЬЗОВАНИЕ 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 миллионов файлов, и для освобождения ведра потребовалось почти неделю. Это удобно, поскольку консоль 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
Заметить, что:
aws s3 rm s3://xyz / --recursive --include "\*.gif"
удаляет все файлы в пути, включая "\*.gif"
aws s3 rm s3://xyz / --recursive --exclude "\*" --include "\*.gif"
удаляет только файлы, соответствующие "\*.gif"
По-видимому, aws s3 rm работает только с отдельными файлами/объектами.
Ниже приведена команда bash, которая работает с некоторым успехом (немного медленно, но работает):
aws s3 ls s3://bucketname/foldername/ |
awk {'print "aws s3 rm s3://bucketname/foldername/" $4'} |
bash
Обратите внимание, что у вас могут возникнуть проблемы, если в именах ваших объектов есть пробелы или забавные символы. Это потому, что команда "aws s3 ls" не будет перечислять такие объекты.
Это решение будет работать, когда вы хотите указать подстановочный знак для имени объекта.
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
Если вы используете 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/%'
Это медленно, но работает