开发者

shell-scripting: Use a pipe as an input for tar

开发者 https://www.devze.com 2022-12-22 09:06 出处:网络
I\'m trying to figure out a way to use tar+pipes on a Ubuntu Server LTS. I\'ve got a postgresql command (pg_dump) that outputs lots of sql on the standard output:

I'm trying to figure out a way to use tar+pipes on a Ubuntu Server LTS.

I've got a postgresql command (pg_dump) that outputs lots of sql on the standard output:

pg_dump -U myUser myDB

I know how to redirect that to a file:

pg_dump -U myUser myDB > myDB.sql

In order to save some disk space, I would rather have it compressed: I can do a tar.gz file from that myDB.sql, and then delete myDB.sql.

But I was wondering - is there a way of doing this without creating the intermediate开发者_如何转开发 .sql file? I believe this could be accomplished with pipes... however I'm no shell guru, and know very little about them (I'm able to do ls | more, that's all). I've tried several variations of pg_dump .. | tar ... but with no success.

How can I use a pipe to use the output of pg_dump as an input for tar? Or did I just get something wrong?


I don't see how "tar" figures into this at all; why not just compress the dump file itself?

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

Then, to restore:

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

The "tar" utility is for bundling up a bunch of files and directories into a single file (the name is a contraction of "tape archive"). In that respect, a "tar" file is kind-of like a "zip" file, except that "zip" always implies compression while "tar" does not.

Note finally that "gzip" is not "zip." The "gzip" utility just compresses; it doesn't make archives.


In your use case pg_dump creates only a single file which needs to be compressed. As others have hinted, in *nix land an archive is a single file representing a filesystem. In keeping with the unix ideology of one tool per task, compression is separate task from archival. Since an archive is a file it can be compressed, as can any other file. Therefore, since you only need to compress a single file, tar is not necessary as others have already correctly pointed out.

However, your title and tags will bring future readers here who might be expecting the following...


Let's say you have a whole folder full of PostgreSQL backups to archive and compress. This should still be done entirely using tar, as its -z or --gzip flag invokes the gzip tool.

So let's also say you need to encrypt your database archives in preparation for moving them to a dubiously secured offsite backup solution (such as an S3-compatible object store). And let's assume you like pre-shared token (password) encryption using the AES cipher.

This would be a valid situation where you might wish to pipe data to and from tar.

Archive -> Compress -> Encrypt

tar cz folder_to_encrypt | openssl enc -aes-256-cbc -e > out.tar.gz.enc

Decrypt -> Uncompress -> Extract

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

Do refer to the GNU tar documentation for details of how the --null flag works and more useful examples for other situations where you might need to pipe files to tar.


tar does not compress, what you want is gzip or a similat compression tool


Tar takes filenames as input. You probably just want to gzip the pg_dump output like so:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号