假设我有一个名为Form.Controls
在这个桶中,我有数百个文件。但我只想删除名为x.y.z
和purple.gif
我可以通过一次调用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
标志。
答案 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
并检查哪些文件将被删除。
答案 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次,因为有时某些删除操作会失败...