有没有办法以编程方式在 Amazon S3 中查找零字节文件?
bucket的总大小超过100G,
我不太可能同步回服务器,然后做一个
find . -size 0 -type f
将 s3cmd 与 awk 结合起来应该很容易做到这一点。
注意:s3cmd 输出 4 列,日期、时间、大小和名称。您希望将大小(第 3 列)与 0 匹配并输出对象名称(第 4 列)。这应该可以解决问题...
$ s3cmd ls -r s3://bucketname | awk '{if ($3 == 0) print $4}'
s3://bucketname/root/
s3://bucketname/root/e
如果您想查看所有信息,只需放下 4 美元,让它只显示打印。
$ s3cmd ls -r s3://bucketname | awk '{if ($3 == 0) print}'
2013-03-04 06:28 0 s3://bucketname/root/
2013-03-04 06:28 0 s3://bucketname/root/e
内存方面,这应该没问题,因为它是一个简单的存储桶列表。
只需使用Boto:
from boto import S3Connection
aws_access_key = ''
aws_secret_key = ''
bucket_name = ''
s3_conn = S3Connection(aws_access_key, aws_secret_key)
s3_conn.get_bucket(bucket_name)
for key in bucket.list():
if key.size == 0:
print(key.key)
关于文件数量,Boto 以每次 1000 个(aws 限制)请求文件元数据(不是实际文件内容),并且它使用生成器,因此内存使用量很小。
JMSE Query:
aws s3api list-objects --bucket $BUCKET --prefix $PREFIX --output json --query 'Contents[?Size==`0`]'
在 amazon s3 上没有直接搜索大小为零字节的文件的过程。您可以通过列出所有对象然后根据大小对这些项目进行排序来做到这一点,然后您可以将所有零文件大小放在一起。
如果您想获取大小为零的所有文件的列表,那么您可以使用 Bucket Explorer 并列出所选存储桶的对象,然后单击大小标题(按大小排序)它会将零字节大小的文件保持在一起。
披露:我是 Bucket Explorer 的开发人员。
使用基本模式匹配查找零长度文件:
hdfs dfs -ls -R s3a://bucket_path/ | grep '^-' | awk -F " " '{if ($4 == 0) print $4, $7}'