idがsigned long longだった。なんとか復元したけどこれでいいのかどうなのか。sizeはlong longまで絶対に行かないのでこれは放置してもかまわない。あと、unpackのときにQが使えなかった。
#!/usr/bin/perl
use strict;
use warnings;
use Net::Amazon::S3;
use bigint;
my $s3 = Net::Amazon::S3->new(
{
aws_access_key_id => $ENV{AWS_ACCESS_KEY_ID},
aws_secret_access_key => $ENV{AWS_SECRET_ACCESS_KEY},
retry => 1,
}
);
my $bucket = $s3->bucket('lopnor-test');
my $res = $bucket->list_all;
use Data::Dumper;
warn Dumper $res->{keys};
for my $key (@{$res->{keys}}) {
warn $key->{key};
if ($key->{size} < 1000) {
my $res = $bucket->get_key($key->{key});
my ($file,$length) = unpack('b N', $res->{value});
warn $file ? 'FILE' : 'DIRECTORY';
$file or next;
warn uri_escape $res->{value};
for (1 .. $length) {
my $skip = 5 + ($_ - 1)*16;
my ($id_u,$id_l,$size_u,$size_l) = unpack("x$skip NNNN", $res->{value});
my $id = ($id_u >= 2 ** 31 ? $id_u - 2 ** 32 : $id_u) * 2 ** 32 + $id_l;
warn $id;
my $size = $size_u * 2**32 + $size_l;
warn $size;
}
}
}