shell脚本:使用管道作为tar的输入

kik*_*ito 13 shell pipe tar

我试图找出一种在Ubuntu Server LTS上使用tar +管道的方法.

我有一个postgresql命令(pg_dump),它在标准输出上输出大量的sql:

pg_dump -U myUser myDB
Run Code Online (Sandbox Code Playgroud)

我知道如何将其重定向到文件:

pg_dump -U myUser myDB > myDB.sql
Run Code Online (Sandbox Code Playgroud)

为了节省一些磁盘空间,我宁愿把它压缩:我可以从myDB.sql做一个tar.gz文件,然后删除myDB.sql.

但我想知道 - 有没有办法在不创建中间.sql文件的情况下这样做?我相信这可以用管道完成......但是我不是外壳大师,对它们知之甚少(我能做到ls | more,就是这样).我尝试过几种不同的pg_dump .. | tar ...但没有成功的.

如何使用管道将输出pg_dump用作tar的输入?或者我刚搞错了什么?

Poi*_*nty 31

我根本没看到"焦油"是怎么形成的; 为什么不只是压缩转储文件本身?

pg_dump -U myUser myDB | gzip > myDB.sql.gz
Run Code Online (Sandbox Code Playgroud)

然后,恢复:

gzip -cd myDB.sql.gz | pg_restore ...
Run Code Online (Sandbox Code Playgroud)

"tar"实用程序用于将一堆文件和目录捆绑到一个文件中(名称是"磁带归档"的缩写).在这方面,"tar"文件有点像"zip"文件,除了"zip"总是意味着压缩而"tar"没有.

最后请注意"gzip"不是"zip"."gzip"实用程序只是压缩; 它不会制作档案.

  • http://www.postgresql.org/docs/9.1/static/backup-dump.html本文档将为您提供有关此主题的完整概述 (3认同)

Ale*_*ski 7

在您的用例中,pg_dump只创建一个需要压缩的文件.正如其他人所暗示的那样,在*nix land中,存档是表示文件系统的单个文件.为了与每个任务一个工具的unix意识形态保持一致,压缩是与存档分开的任务.由于存档是文件,因此可以压缩文件,也可以压缩任何其他文件.因此,由于您只需要压缩单个文件,因此没有必要使用tar,因为其他人已经正确指出了.

但是,您的标题和标签将为未来的读者带来可能期待以下内容的读者......


假设你有一个完整的PostgreSQL备份文件夹来存档和压缩.这应该仍然完全使用tar完成,因为它-z--gzip标志调用gzip工具.

因此,我们还要说,您需要对数据库存档进行加密,以便将它们转移到可疑的安全异地备份解决方案(例如与S3兼容的对象存储库).我们假设您喜欢使用AES密码进行预共享令牌(密码)加密.

这可能是一种有效的情况,您可能希望将数据与tar进行管道传输.

存档 - >压缩 - >加密

tar cz folder_to_encrypt | openssl enc -aes-256-cbc -e > out.tar.gz.enc
Run Code Online (Sandbox Code Playgroud)

解密 - >解压缩 - >提取

openssl enc -aes-256-cbc -in ./out.tar.gz.enc -d | tar xz --null
Run Code Online (Sandbox Code Playgroud)

请参阅GNU tar文档以获取有关--null标志如何工作的详细信息,以及有关可能需要将文件传递给tar的其他情况的更有用示例.