gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:24:13 29 4
gpt4 key购买 nike

我需要将大量文件移动到带有完整时间戳的 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 header 中文件大小字段的大小)。
经过进一步研究 - 我还找到了一个解决方案( here ),它展示了如何使用拆分创建一组 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,prefix .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
这使用 --files-from tar 选项以避免需要将单个文件作为命令参数传递并在那里遇到限制。

关于bash - 如何使用大小限制 tar 文件并写入远程位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72625880/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com