如何使用通配符搜索 Amazon S3 存储桶?

Posted

技术标签:

【中文标题】如何使用通配符搜索 Amazon S3 存储桶?【英文标题】:How to search an Amazon S3 Bucket using Wildcards? 【发布时间】:2015-07-10 08:36:45 【问题描述】:

This *** answer helped a lot. 但是,我想搜索给定存储桶中的所有 PDF。

    我单击“无”。 开始输入。 我输入*.pdfEnter

什么都没有发生。有没有办法通过在线 S3 GUI 控制台使用通配符或正则表达式过滤存储桶搜索结果?

【问题讨论】:

【参考方案1】:

正如评论中所述,亚马逊的 UI 只能用于根据他们自己的文档按前缀搜索:

http://docs.aws.amazon.com/AmazonS3/latest/UG/searching-for-objects-by-prefix.html

还有其他搜索方法,但它们需要一些努力。仅举两个选项,AWS-CLI 应用程序或Boto3 用于 Python。

我知道这篇文章很旧,但它在 Google 的 s3 搜索列表中名列前茅,并且没有公认的答案。 Harish 的另一个答案是链接到一个死网站。

更新 2020/03/03:上面的 AWS 链接已被删除。这是一个非常相似的主题的链接,我可以找到它。 https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html

【讨论】:

请注意,在提出问题时该文档并不存在。 还要注意这个文档不再存在,并重定向到文档主页。 还需要注意的是,not 允许更丰富的搜索和 only 在当前控制台页面上对项目进行排序,这使得在 S3 控制台中无法找到内容. (一定要从控制台发送 AWS 反馈。)【参考方案2】:

AWS CLI 搜索: 在 AWS 控制台中,我们只能在目录中搜索对象,但不能在整个目录中搜索,也只能搜索文件的前缀名称(S3 搜索限制)。

最好的方法是在 Linux 操作系统中使用 AWS CLI 和以下命令

aws s3 ls s3://bucket_name/ --recursive | grep search_word | cut -c 32- 

使用通配符搜索文件

aws s3 ls s3://bucket_name/ --recursive |grep '*.pdf'

【讨论】:

您能解释一下这将如何帮助我找到所有 PDF 文件吗? aws s3 ls s3://bucket_name/ --recursive |grep *.pdf 我必须使用句点:'.*.pdf' - 见***.com/a/1069333/12383690【参考方案3】:

如果您在 Python 中使用 boto3,则很容易找到文件。将 'bucket' 替换为存储桶的名称。

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('bucket')
for obj in bucket.objects.all():
    if '.pdf' in obj.key:
        print(obj.key)

【讨论】:

令人沮丧的是他们不能做“后缀”,因为他们已经有一个前缀变量。【参考方案4】:

您可以使用带有--dryrun 标志的复制功能:

aws s3 ls s3://your-bucket/any-prefix/ .\ --recursive --exclude * --include *.pdf --dryrun

它将显示所有 PDF 文件。

【讨论】:

我得到未知选项:. --递归 那是因为@user2568374 有正确的想法但错误的例子。应该是:aws s3 cp s3://your-bucket/any-prefix/ . --recursive --exclude "*" --include "*.pdf" --dryrun 比较 AWS 文档,aws s3 cp 似乎有一个通配符功能,就像 Yossi 在这里指出的那样,aws s3 ls 似乎没有通配符功能。【参考方案5】:

我在我的一个项目中使用过它,但它有点硬编码

import subprocess
bucket = "Abcd"
command = "aws s3 ls s3://"+ bucket + "/sub_dir/ | grep '.csv'"
listofitems = subprocess.check_output(command, shell=True,)
listofitems = listofitems.decode('utf-8')
print([item.split(" ")[-1] for item in listofitems.split("\n")[:-1]])

【讨论】:

【参考方案6】:

使用 Java SDK 的文档表明可以这样做:

https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingJava.html

特别是函数listObjectsV2Result 允许您指定前缀过滤器,例如“files/2020-01-02*”,因此您只能返回与今天日期匹配的结果。

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ListObjectsV2Result.html

【讨论】:

【参考方案7】:

我猜这些文件是从 unix 系统上传的,而您下载到 Windows,所以 s3cmd 无法保留不适用于 NTFS 的文件权限。

要搜索文件并获取它们,请尝试从目标目录中执行此操作或将 ./ 更改为目标:

for i in `s3cmd ls s3://bucket | grep "searchterm" | awk 'print $4'`; do s3cmd sync --no-preserve $i ./; done

这适用于 Windows 中的 WSL。

【讨论】:

以上是关于如何使用通配符搜索 Amazon S3 存储桶?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不下载文件的情况下搜索amazon S3存储桶中的文件内容

在 Amazon S3 中公开存储桶 [关闭]

如何将日志从 Amazon S3 存储桶导入到 cloudwatch

Amazon S3 boto:如何重命名存储桶中的文件?

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例

使用 AWSSDK.S3 使用 C# 对 Amazon S3 存储桶进行身份验证