【问题标题】:Filter S3 list-objects results to find a key matching a pattern过滤 S3 列表对象结果以查找与模式匹配的键
【发布时间】:2020-10-21 19:51:54
【问题描述】:

我想使用 AWS CLI 查询存储桶的内容并查看是否存在特定文件,但该存储桶包含数千个文件。如何过滤结果以仅显示与模式匹配的键名?例如:

aws s3api list-objects --bucket myBucketName --query "Contents[?Key==*mySearchPattern*]"

【问题讨论】:

    标签: amazon-s3 pattern-matching aws-cli jmespath


    【解决方案1】:

    --query 参数使用 JMESPath 表达式。 JMESPath has an internal function contains 允许您搜索字符串模式。

    这应该会产生预期的结果:

    aws s3api list-objects --bucket myBucketName --query "Contents[?contains(Key, `mySearchPattern`)]"
    

    (对于 Linux,我需要使用单引号 ' 而不是在 mySearchPattern 周围使用反引号 `。)

    如果要搜索以特定字符开始的键,也可以使用--prefix 参数:

    aws s3api list-objects --bucket myBucketName --prefix "myPrefixToSearchFor"
    

    【讨论】:

    • 在 Linux 上使用单引号不起作用。但是逃避反引号是有效的。 (例如。\`mySearchPattern\`)
    • 另外,如果 mySearchPattern 是一个纯数字(例如 20150101 ),那么 CLI 会抱怨它应该是一个字符串而不是整数。即使你确实引用了它。没有找到解决方案,除了在 searchPattern 中包含一个非数字(例如 20150101/ )然后它不会抱怨。
    • 感谢单引号评论!我想知道 wtf 是怎么回事 ,,,,
    【解决方案2】:

    我在 Ubuntu 14、awscli 1.2 上试过

    --query "Contents[?contains(Key,'stati')].Key" 
    --query "Contents[?contains(Key,\'stati\')].Key" 
    --query "Contents[?contains(Key,`stati`)].Key"
    

    非法代币值'?contains(Key,'stati')].Key'

    将 aws 版本升级到 1.16 后,使用

    --query "Contents[?contains(Key,'stati')].Key" 
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2021-05-03
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多