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

14

我试图找出在Ubuntu Server LTS上使用tar+pipes的方法。

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

pg_dump -U myUser myDB

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

pg_dump -U myUser myDB > myDB.sql
为了节省磁盘空间,我更愿意压缩它:我可以从myDB.sql创建tar.gz文件,然后删除myDB.sql。
但是我想知道 - 是否有一种方法可以在不创建中间 .sql 文件的情况下完成这个过程?我相信这可以通过管道实现...但我不是shell大师,对它们知之甚少(我只能使用ls | more)。我已尝试使用pg_dump .. | tar ...的几个变体,但没有成功。
如何使用管道将pg_dump的输出作为tar的输入?或者我搞错了什么?
4个回答

32

我不明白为什么“tar”与此有任何关系;为什么不直接压缩转储文件本身?

pg_dump -U myUser myDB | gzip > myDB.sql.gz

接着,要进行恢复:

gzip -cd myDB.sql.gz | pg_restore ...

"tar"工具用于将一堆文件和目录捆绑成一个单独的文件(名称是“tape archive”的缩写)。在这方面,“tar”文件有点像“zip”文件,但“zip”总是意味着压缩,而“tar”则不是。

最后请注意,“gzip”不是“zip”。 “gzip”实用程序只是进行压缩,它不会创建档案。


或者 zcat myDB.sql.gz |pg_restore ... - vezult
3
这份文档将为您提供有关此主题的全面概述。 - 0xPixelfrost

7
在您的用例中,pg_dump只创建一个需要压缩的文件。正如其他人所提示的,在*nix领域,存档是表示文件系统的单个文件。为了遵循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

解密 -> 解压缩 -> 提取

openssl enc -aes-256-cbc -in ./out.tar.gz.enc -d | tar xz --null

请参考GNU tar文档了解--null标志的工作原理以及其他需要将文件传输到tar的情况下的更多有用示例。详情

2

Tar命令需要文件名作为输入。您可能只想像这样gzip压缩pg_dump输出:

pg_dump -U myUser myDB |gzip > myDB.sql.gz

2

tar 不会压缩文件,你需要使用 gzip 或类似的压缩工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接