如何使用有大小限制的tar文件并写入远程位置?



我需要在时间戳完整的情况下将大量文件移动到S3 (c-time, m-time等需要完整=>我不能使用aws s3 sync命令)-为此我使用以下命令:

sudo tar -c --use-compress-program=pigz -f - <folder>/ |  aws s3 cp - s3://<bucket>/<path-to-folder>/

当尝试使用上面的命令创建tar.gz文件时——对于一个80+GB的文件夹——我遇到了以下错误:

upload failed: - to s3://<bucket>/<path-to-folder>/<filename>.tar.gz An error occurred (InvalidArgument) when calling the UploadPart operation: Part number must be an integer between 1 and 10000, inclusive

经过研究,我发现tar文件有68GB的限制(tar头文件大小字段的大小)。

经过进一步的研究,我还发现了一个解决方案(这里),它展示了如何使用split创建一组tar.gz文件:

tar cvzf - data/ | split --bytes=100GB - sda1.backup.tar.gz.

,以后可以使用:

cat sda1.backup.tar.gz.* | tar xzvf -

但是- split有不同的签名:分裂[选项]…(文件(前缀))

…所以-明显的解决方案:

sudo tar -c --use-compress-program=pigz -f - folder/ | split --bytes=20GB - prefix.tar.gz. | aws s3 cp - s3://<bucket>/<path-to-folder>/

…将不起作用-因为split使用前缀作为字符串,并将输出写入具有该名称集的文件。

问题是:是否有一种方法来编码,这样我就可以有效地使用管道解决方案(即。,不使用额外的磁盘空间),但仍然获得一组文件(称为prefix.tar.gz)。(aa,前缀。tar.gz.ab等)在S3?

任何指针都会有帮助的。

——PK

这看起来是个不小的挑战。伪代码可能像这样:

# Start with an empty list
list = ()
counter = 1
foreach file in folder/ do
if adding file to list exceeds tar or s3 limits then
# Flush current list of files to S3
write list to tmpfile
run tar czf - --files-from=tmpfile | aws s3 cp - s3://<bucket>/<path-to-file>.<counter>
list = ()
counter = counter + 1
end if
add file to list
end foreach
if list non-empty
write list to tmpfile
run tar czf - --files-from=tmpfile | aws s3 cp - s3://<bucket>/<path-to-file>.<counter>
end if

这使用tar的--files-from选项来避免需要将单个文件作为命令参数传递,并且遇到中的限制。

最新更新