无论如何使用ls和通配符从s3存储桶中提取文件? (aws cli)

时间:2017-07-26 15:14:25

标签: linux bash shell aws-cli

我在尝试列出s3存储桶目录中的匹配文件时遇到了一些问题。

我一直在使用ls来创建特定目录中所有文件的列表(包括时间戳和文件大小),方法是将其附加到新文件,例如aws s3 --profile mybucket1 ls s3://my-bucket1/directory1/directory2/ >> list.txt

这既快速又按预期工作。但是,我在directory1中也有一些我想要列出的文件,但只有某些文件与特定字符串匹配,并且周围有通配符。

我最接近实现这一点的是使用cp(使用--exclude和--include)而不是ls,因为ls不允许你使用--exclude或--include选项,例如{ {1}}但是它甚至需要永久地复制单个文件(我没有得到任何标准输出,因为我相信它会在复制任何内容之前扫描整个目录,寻找匹配的字符串)。我也无法删除--recursive,因为它在没有它的情况下给我一个错误,即使我只想复制directory1中的文件。

我的偏好是使用ls,因为它更快,我不必再对下载的文件做另外的ls,以生成与我列出的文件相同的格式,并从目录2中添加。

另外,我在bash脚本中运行所有这些命令,以防万一。

我希望这是有道理的,如果有人对此有任何可能的解决方案,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

您应该查看aws s3api list-objects

  1. 如果您的模式位于密钥的开头,并且您希望与match-me*匹配,则可以使用--prefix参数:

    aws s3api list-objects --bucket <bucket> --prefix "match-me" 
    

    将返回以 match-me

  2. 开头的所有键
  3. 如果您的模式位于键名的中间,并且您希望与*match-me*匹配,则可以针对结果运行查询:

    aws s3api list-objects --bucket test-bucket-fh --query "Contents[?contains(Key, 'match-me')]"
    

答案 1 :(得分:0)

如果您需要列出Amazon S3的内容并不紧急(例如每天执行一次),那么您可以使用Amazon S3 Storage Inventory

  

Amazon S3广告资源为S3存储桶提供对象的逗号分隔值(CSV)平面文件输出及其每日或每周的相应元数据或共享前缀(即名称以公共字符串开头的对象)。

它在Amazon S3中提供包含所有对象列表的每日/每周文件。其他charges适用。