我需要在时间戳完整的情况下将大量文件移动到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
选项来避免需要将单个文件作为命令参数传递,并且遇到在中的限制。