bash - 如何将 tar 压缩操作通过管道传输到 aws s3 cp?

标签 bash amazon-s3 pipe aws-sdk tar

我正在用 bash 编写一个自定义备份脚本供个人使用。目标是通过 tar/gzip 压缩目录的内容,拆分压缩存档,然后将各部分上传到 AWS S3。

几个月前我第一次尝试编写这个脚本时,我能够通过类似的方式让它工作:

tar -czf - /mnt/STORAGE_0/dir_to_backup | split -b 100M -d -a 4 - /mnt/SCRATCH/backup.tgz.part
aws s3 sync /mnt/SCRATCH/ s3://backups/ --delete
rm /mnt/SCRATCH/*

这对我的目的来说效果很好,但需要 /mnt/SCRATCH 有足够的磁盘空间来存储压缩目录。现在我想改进这个脚本,使其不必依赖于 /mnt/SCRATCH 中有足够的空间,并做了一些研究。我最终得到了类似的东西:

tar -czf - /mnt/STORAGE_0/dir_to_backup | split -b 100M -d -a 4 --filter "aws s3 cp - s3://backups/backup.tgz.part" -

这几乎可以工作,但我的 S3 存储桶上的目标文件名不是动态的,而且它似乎只是在运行时多次覆盖 backup.tgz.part 文件。最终结果只是一个 100MB 的文件,而预期的几个 100MB 文件的结尾如 .part0001

任何指导将不胜感激。谢谢!

最佳答案

当使用split 时,您可以使用环境变量$FILE 来获取生成的文件名。 参见 split man page :

--filter=COMMAND
     write to shell COMMAND; file name is $FILE

对于您的用例,您可以使用如下内容:

--filter 'aws s3 cp - s3://backups/backup.tgz.part$FILE'

(需要单引号,否则会立即进行环境变量替换)

这将在 aws 上生成以下文件名:

backup.tgz.partx0000
backup.tgz.partx0001
backup.tgz.partx0002
...

完整示例:

tar -czf - /mnt/STORAGE_0/dir_to_backup | split -b 100M -d -a 4 --filter 'aws s3 cp - s3://backups/backup.tgz.part$FILE' -

关于bash - 如何将 tar 压缩操作通过管道传输到 aws s3 cp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57079147/

相关文章:

ios - 使用适用于iOS的Amazon S3 Transfer Utility设置元数据

r - 在 perl 中打开管道时直接使用 STDERR

linux - bash:家园:找不到命令

macos - 什么相当于 OsX 下的 xargs -r

linux - 目录名的排序和提取

即使在关闭其输入后,子进程也会挂起

C Unix - 循环中的 fork()、execl() 和管道

bash - 从 grep 中获取空白字符到数组中

java - AWS Lambda 尝试列出 DynamoDb 表时出错

amazon-web-services - 由于 Amplify 上的身份验证 token 过期较短,AWS S3 预签名 URL 过期