【问题标题】:How to get the file diff between two S3 buckets?如何获取两个 S3 存储桶之间的文件差异?
【发布时间】:2023-03-15 23:11:01
【问题描述】:

所以我有一个 S3 视频桶(数百个),我使用 ElasticTranscoder 将所有内容转码到第二个优化的桶中。

但是,当我检查我的第二个存储桶时,对象少了 40-50 个,但我无法弄清楚它们是什么(目录结构嵌套很深等)。

如何使用aws s3api list-objects 获取两个存储桶的文件差异?

也许存储桶中有不是视频的文件,我不知何故不知道。

【问题讨论】:

  • 您有命名约定吗?从第一个桶和第二个桶中获取所有对象列表,按摩名称然后获取差异?!

标签: shell amazon-web-services unix amazon-s3 aws-sdk


【解决方案1】:

使用Display only filenames

aws s3 ls s3://bucket-1 --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//' | sort > bucket_1_files
aws s3 ls s3://bucket-2 --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//' | sort > bucket_2_files

diff bucket_1_files bucket_2_files

【讨论】:

    【解决方案2】:

    您可以使用sync 命令和--dryrun 选项进行比较而不是同步。

    aws s3 sync s3://bucket s3://bucket2 --dryrun

    当然,您也可以使用它来比较本地目录和存储桶。

    aws s3 sync . s3://bucket2 --dryrun

    【讨论】:

    • 太棒了!这是最好的答案
    • 如果没有结果,不要惊慌:这意味着两者是相同的
    【解决方案3】:

    灵感来自@George 评论

    您可以使用它来提取路径列表:

    aws s3 sync s3://<main-bucket> s3://<second-bucket> --dryrun | awk 'match($3,"^(s3://[^/]+/)(.*)",a) {print a[2]}'
    

    或用于本地路径

    aws s3 sync <local-path> s3://darsak2.public --dryrun | awk 'match($3,"^(./)?(.*)",a) {print a[2]}'
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2017-02-14
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多