如何使用 AWS S3 CLI 将 .tar 中的 .zip 复制到给定位置而不提取整个 .tar

如何使用 AWS S3 CLI 将 .tar 中的 .zip 复制到给定位置而不提取整个 .tar

OSX 10.11-python3.5 或 AWS CLI(或其他工具?)

我在 Amazon S3 存储桶内有大约 5,000 个子目录,每个子目录包含一个 .tar。每个 .tar 中仅包含一个 .zip,大小约为 1mb。

我想要做的是运行一个脚本,该脚本将访问 S3 存储桶内的每个子目录,并将每个 .tar 中找到的 .zip 复制到给定的 s3 位置或本地目的地。

每个 .tar 解压后约为 10-15GB,因此提取全部内容不可行/不需要。我相信可以读取 .tar 标头,以便找到 .zip 并进行复制。

你能告诉我实现这一目标的方法吗

答案1

从存档 tarfile.tar 中提取一个名为 zipfile.zip 的文件:

tar xvf /path/to/tarfile.tar /path/to/where/you/want/zipfile.zip

你可以使用 perl 来递归

#!/usr/bin/perl
my @directories_to_search = ('/root/path/to/s3/dir/');
use File::Find;
use File::Basename;

finddepth(\&extract_zip, @directories_to_search);

sub extract_zip {
    return unless /tar$/; # ignore all but tar files
    my $tarname = $File::Find::name;
    `tar xvf "$tarname" /desired/path/name-of-zip-inside-archive.zip`;
}

与上述非常接近的方法应该可以工作。(在 El capitan 中测试)。您可能遇到的问题是每个 tar 存档中的 zip 文件名是否不同。如果是这样,您需要在提取之前获取 tar 中的 zip 名称(或者如果有模式匹配,例如 *.zip,您可以尝试这样做)

相关内容