bash - 如何将 tar 压缩操作通过管道传输到 aws s3 cp?
问题描述
我正在用 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
时可以使用 env 变量$FILE
来获取生成的文件名。请参阅拆分手册页:
--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' -
推荐阅读
- architecture - 关于hack架构的问题
- angular - 你了解这个带有 lambda 函数的 POST 请求的问题吗?
- ms-access - 如何为从表/查询中提取值的组合框设置默认值?
- rebus - 使用 Rebus 的发布者和订阅者正确的代码和设置
- java - 检查用户名是否存在于firebase数据库中
- javascript - 我需要为文本字段验证编写 Regx,它以“iqn.yyyy-mm.com”开头。或“eqn”。
- kubernetes - 为什么 Istio 限速工作不正确?
- c# - 将拉丁字母翻译成英文字母的最佳方法
- flask - 如何在 flask_restplus 中返回具有多个 marshal_with() 的响应?
- go - 如何使用 JFrog Artifactory 将 GitHub 代理为 Go Repository?