如何使用 AWS CLI 删除 S3 存储桶中的多个文件
How to delete multiple files in S3 bucket with AWS CLI
假设我有一个名为 x.y.z
的 S3 存储桶
在这个桶中,我有数百个文件。但我只想删除 2 个名为 purple.gif
和 worksheet.xlsx
的文件
我可以通过调用 rm
从 AWS 命令行工具执行此操作吗?
这没有用:
$ 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
并检查哪些文件将被删除。
我发现这个通过命令行很有用。我有超过 400 万个文件,清空桶花了将近一周的时间。这很方便,因为 AWS 控制台没有描述日志。
注意:您需要安装 jq
工具。
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 仅适用于个人 files/objects。
下面是一个bash命令,它构造了单独的删除命令,然后一个一个地删除对象。取得了一些成功(可能有点慢,但有效):
aws s3 ls s3://bucketname/foldername/ |
awk {'print "aws s3 rm s3://bucketname/foldername/" '} |
bash
前两行用于构造“rm”命令,第 3 行 (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/" '} | bash
如果您使用的是 AWS CLI,则可以使用 grep regex 筛选 LS 结果并将其删除。例如
aws s3 ls s3://BUCKET | awk '{print }' | 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/%'
这很慢但有效
此命令删除存储桶中的文件。
aws s3 rm s3://buketname --recursive
在 AWS 中删除超大文件夹的快速方法
AWS_PROFILE=<AWS_PROFILE> AWS_BUCKET=<AWS_BUCKET> AWS_FOLDER=<AWS_FOLDER>; aws --profile $AWS_PROFILE s3 ls "s3://${AWS_BUCKET}/${AWS_FOLDER}/" | awk '{print }' | xargs -P8 -n1000 bash -c 'aws --profile '${AWS_PROFILE}' s3api delete-objects --bucket '${AWS_BUCKET}' --delete "Objects=[$(printf "{Key='${AWS_FOLDER}'/%s}," "$@")],Quiet=true" >/dev/null 2>&1'
PS:这可能会启动 2/3 次,因为有时某些删除会失败...
您可以使用aws s3 rm
删除多个文件。如果要删除特定文件夹中的所有文件,只需使用
aws s3 rm --recursive --region <AWS_REGION> s3://<AWS_BUCKET>/<FOLDER_PATH>/
首先使用 --dryrun
选项对其进行测试!
假设我有一个名为 x.y.z
在这个桶中,我有数百个文件。但我只想删除 2 个名为 purple.gif
和 worksheet.xlsx
我可以通过调用 rm
从 AWS 命令行工具执行此操作吗?
这没有用:
$ 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
并检查哪些文件将被删除。
我发现这个通过命令行很有用。我有超过 400 万个文件,清空桶花了将近一周的时间。这很方便,因为 AWS 控制台没有描述日志。
注意:您需要安装 jq
工具。
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 仅适用于个人 files/objects。
下面是一个bash命令,它构造了单独的删除命令,然后一个一个地删除对象。取得了一些成功(可能有点慢,但有效):
aws s3 ls s3://bucketname/foldername/ |
awk {'print "aws s3 rm s3://bucketname/foldername/" '} |
bash
前两行用于构造“rm”命令,第 3 行 (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/" '} | bash
如果您使用的是 AWS CLI,则可以使用 grep regex 筛选 LS 结果并将其删除。例如
aws s3 ls s3://BUCKET | awk '{print }' | 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/%'
这很慢但有效
此命令删除存储桶中的文件。
aws s3 rm s3://buketname --recursive
在 AWS 中删除超大文件夹的快速方法
AWS_PROFILE=<AWS_PROFILE> AWS_BUCKET=<AWS_BUCKET> AWS_FOLDER=<AWS_FOLDER>; aws --profile $AWS_PROFILE s3 ls "s3://${AWS_BUCKET}/${AWS_FOLDER}/" | awk '{print }' | xargs -P8 -n1000 bash -c 'aws --profile '${AWS_PROFILE}' s3api delete-objects --bucket '${AWS_BUCKET}' --delete "Objects=[$(printf "{Key='${AWS_FOLDER}'/%s}," "$@")],Quiet=true" >/dev/null 2>&1'
PS:这可能会启动 2/3 次,因为有时某些删除会失败...
您可以使用aws s3 rm
删除多个文件。如果要删除特定文件夹中的所有文件,只需使用
aws s3 rm --recursive --region <AWS_REGION> s3://<AWS_BUCKET>/<FOLDER_PATH>/
首先使用 --dryrun
选项对其进行测试!