我在尝试列出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脚本中运行所有这些命令,以防万一。
我希望这是有道理的,如果有人对此有任何可能的解决方案,我们将不胜感激。
答案 0 :(得分:1)
如果您的模式位于密钥的开头,并且您希望与match-me*
匹配,则可以使用--prefix
参数:
aws s3api list-objects --bucket <bucket> --prefix "match-me"
将返回以 match-me
如果您的模式位于键名的中间,并且您希望与*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适用。