如何使用AWS CLI删除S3存储桶中的多个文件

时间:2017-01-19 03:40:43

标签: amazon-web-services amazon-s3 aws-cli

假设我有一个名为Form.Controls

的S3存储桶

在这个桶中,我有数百个文件。但我只想删除名为x.y.zpurple.gif

的2个文件

我可以通过一次调用worksheet.xlsx从AWS命令行工具执行此操作吗?

这不起作用:

rm

manual开始,您似乎无法按名称明确删除文件列表。有谁知道这样做的方法?我不想使用$ aws s3 rm s3://x.y.z/worksheet.xlsx s3://x.y.z/purple.gif Unknown options: s3://x.y.z/purple.gif 标志。

10 个答案:

答案 0 :(得分:28)

您可以通过多次提供--exclude--include参数来执行此操作。但是,您必须使用--recursive来实现此目的。

如果有多个过滤器,请记住过滤器参数的顺序非常重要。规则是稍后在命令中出现的过滤器优先于命令中较早出现的过滤器。

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

此处,除 purple.gif worksheet.xlsx 外,所有文件都将从命令中排除。

如果您不确定,请先尝试--dryrun并检查哪些文件将被删除。

来源:Use of Exclude and Include Filters

答案 1 :(得分:10)

您无法使用s3 rm,但可以使用s3api delete-objects

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

答案 2 :(得分:6)

在AWS S3(AWS CLI)中使用UNIX WILDCARDS

当前,AWS CLI在命令的“ path”参数中不支持UNIX通配符。但是,使用几个aws s3命令中可用的--exclude和--include参数来复制此功能非常容易。

可使用的通配符为:

“ *” –匹配所有内容

“?” –匹配任何单个字符

“ []” –匹配括号之间的任何单个字符

“ [!]” –匹配括号之间的任何单个字符

关于在aws s3命令中使用-include -exclude 的几点注意事项:

您可以使用任意数量的-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" ```

答案 3 :(得分:1)

我通过命令行发现这个有用。我有超过400万个文件,花了差不多一个星期来清空桶。这很方便,因为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

答案 4 :(得分:1)

注意:

aws s3 rm s3://x.y.z/ --recursive --include "\*.gif"删除路径中的所有文件,包括"\*.gif"

aws s3 rm s3://x.y.z/ --recursive --exclude "\*" --include "\*.gif"仅删除与"\*.gif"匹配的文件

答案 5 :(得分:1)

如果您使用的是AWS CLI,则可以使用grep regex过滤LS结果并将其删除。例如

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/%'

这很慢,但是有效

答案 6 :(得分:0)

显然aws s3 rm仅适用于单个文件/对象。

下面是一个bash命令,该命令可以成功使用(有点慢,但是可以):

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

请注意,如果对象名称包含空格或有趣的字符,则可能会遇到问题。这是因为“ aws s3 ls”命令不会列出此类对象。

答案 7 :(得分:0)

当您要为对象名称指定通配符时,此解决方案将起作用。

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 :(得分:0)

此命令删除存储桶中的文件。
aws s3 rm s3://buketname --recursive

答案 9 :(得分:0)

在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 $4}' | 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次,因为有时某些删除操作会失败...