如何找出两个AWS S3存储桶中仅存在于其中一个桶的文件?
如何找出两个AWS S3存储桶中仅存在于其中一个桶的文件?
我来给你分享几个实用的方法,都是日常和S3打交道时常用的,操作起来不复杂,按需选就行:
方法一:用
s3 sync模拟运行快速查差异
AWS CLI的s3 sync命令本来是用来同步两个存储桶的,加上--dryrun参数后,它只会模拟同步操作,不会真的修改任何文件,同时会输出所有需要同步的文件——也就是仅在源桶存在、目标桶没有的文件。
比如你要找s3://bucket-a有但s3://bucket-b没有的文件,直接跑这条命令:aws s3 sync s3://bucket-a s3://bucket-b --dryrun输出里以
upload:开头的行,就是桶A独有的文件;反过来,要找桶B独有的,只要把源和目标桶调换位置:aws s3 sync s3://bucket-b s3://bucket-a --dryrun这个方法的好处是不用下载任何本地文件,直接在命令行就能看到结果,还会自动忽略大小和修改时间完全一致的文件,效率很高。
方法二:导出文件列表后本地对比(适合留存记录)
如果需要把差异结果保存下来,或者要处理超大规模的桶,可以先把两个桶的文件路径导出到本地文本,再用对比工具分析:- 先导出两个桶的文件路径(用
awk过滤掉日期、大小这些无关信息,只保留纯路径):# 导出桶A的文件路径列表 aws s3 ls s3://bucket-a --recursive | awk '{print $4}' > bucket-a-files.txt # 导出桶B的文件路径列表 aws s3 ls s3://bucket-b --recursive | awk '{print $4}' > bucket-b-files.txt - 用本地工具对比:
- 如果你用Linux或macOS,直接用
comm命令就能快速筛选:# 只显示桶A独有的文件 comm -23 <(sort bucket-a-files.txt) <(sort bucket-b-files.txt) # 只显示桶B独有的文件 comm -13 <(sort bucket-a-files.txt) <(sort bucket-b-files.txt) - 如果你用Windows,Beyond Compare、Notepad++的对比插件这类可视化工具都能轻松搞定文本对比。
这个方法的优势是可以留存差异记录,而且文本文件本身占用空间极小,哪怕桶里有几百万个文件也能处理。
- 如果你用Linux或macOS,直接用
- 先导出两个桶的文件路径(用
方法三:精准对比(含文件内容差异)
要是你不仅要找路径不存在的文件,还要找路径相同但内容不一样的文件,可以结合S3 API和JSON工具来做:- 导出两个桶的文件路径+ETag(ETag相当于文件的哈希值,内容不同的话ETag大概率不同):
# 导出桶A的文件路径和ETag aws s3api list-objects-v2 --bucket bucket-a --query 'Contents[].{Key: Key, ETag: ETag}' --output json | jq -r '.[] | "\(.Key) \(.ETag)"' > bucket-a-hashes.txt # 导出桶B的文件路径和ETag aws s3api list-objects-v2 --bucket bucket-b --query 'Contents[].{Key: Key, ETag: ETag}' --output json | jq -r '.[] | "\(.Key) \(.ETag)"' > bucket-b-hashes.txt - 再用
diff或者comm对比这两个文件,就能同时找出:仅在一个桶存在的文件,以及路径相同但内容不同的文件。
- 导出两个桶的文件路径+ETag(ETag相当于文件的哈希值,内容不同的话ETag大概率不同):
小提示:运行这些命令前,确保你的AWS CLI已经配置好对应S3桶的s3:ListBucket权限;如果桶里文件量很大,导出列表可能需要几分钟,耐心等就行~
备注:内容来源于stack exchange,提问作者Franck Dernoncourt
相关产品推荐
相关产品推荐

