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

Saq*_*Ali 14 amazon-s3 amazon-web-services 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
Run Code Online (Sandbox Code Playgroud)

手册中,您似乎无法按名称明确删除文件列表.有谁知道这样做的方法?我不喜欢使用--recursive旗帜.

Kha*_* T. 38

您可以通过多次提供--exclude--include参数来完成此操作.但是,你必须使用--recursive它来工作.

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

aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"
Run Code Online (Sandbox Code Playgroud)

在这里,除了purple.gifworksheet.xlsx之外,所有文件都将从命令中排除.

来源:使用排除和包含过滤器

  • 请注意,这也将删除与--include模式匹配的子文件夹中的所有文件 (4认同)
  • 虽然这可能不是原始提问者的最佳答案,但我很确定在搜索“如何通过指定模式从存储桶中删除多个文件”的答案后,我并不是一个人来到这里。谢谢!但我确实觉得它有点吓人,我建议添加一个建议来尝试使用“--dryrun”参数。 (3认同)
  • 是的。使用像“aws s3 rm s3:///test-folder/ --include "*.txt"”这样的逻辑(对我来说)来删除此目录中的所有文本文件没有任何作用。然后 `aws s3 rm s3:///test-folder/ --recursive --include "*.txt"` 实际上会擦除 `/test-folder/` 中的所有文件和子目录!您可能认为它只需要 .txt 文件...呵呵。+1 表示“--dry-run” (2认同)

spg*_*spg 14

你不能使用s3 rm,但你可以使用s3api delete-objects:

aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
Run Code Online (Sandbox Code Playgroud)

  • 这行得通,但是答案的“您不能使用`s3 rm`”部分是*不正确的*。 (3认同)

Thy*_*yag 10

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

下面是一个 bash 命令,它构造单独的删除命令,然后一个一个地删除对象。取得了一些成功(可能有点慢,但有效):

aws s3 ls s3://bucketname/foldername/ | 
awk {'print "aws s3 rm s3://bucketname/foldername/" $4'} | 
bash
Run Code Online (Sandbox Code Playgroud)

前两行用于构建“rm”命令,第三行 (bash) 将执行它们。

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

  • 也许不是选美比赛的获胜者,但是嘿 - 它有效,并且如果您不直接进行 bash,它可以让您有机会检查您的“删除计划”。谢谢! (2认同)

小智 10

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


Ana*_*mar 7

aws s3 rm s3://<bucketname>/2023/ --recursive --exclude '*' --include 'A*.csv' 
Run Code Online (Sandbox Code Playgroud)

上面的答案都没有提到如何使用通配符表达式来选择多个文件并删除。

如果您的用例是使用命名模式选择 S3 中的多个对象并删除,则上述命令将很有用


Sun*_*rma 5

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

当前,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" ```
Run Code Online (Sandbox Code Playgroud)