【问题标题】:shell-scripting: Use a pipe as an input for tarshell-scripting:使用管道作为 tar 的输入
【发布时间】:2010-03-04 13:15:28
【问题描述】:

我正在尝试找出一种在 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 文件的情况下做到这一点?我相信这可以通过管道来完成......但是我不是外壳专家,对它们知之甚少(我能够做到ls | more,仅此而已)。我尝试了pg_dump .. | tar ... 的几种变体,但都没有成功。

如何使用管道将pg_dump 的输出用作tar 的输入?还是我只是弄错了什么?

【问题讨论】:

    标签: shell pipe tar


    【解决方案1】:

    我根本看不出“焦油”是如何影响这一点的;为什么不直接压缩转储文件本身?

    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”实用程序只是压缩;它不制作档案。

    【讨论】:

    【解决方案2】:

    在您的用例中,pg_dump 仅创建一个需要压缩的文件。正如其他人所暗示的那样,在 *nix 领域,档案是代表文件系统的单个文件。为了与 每个任务一个工具 的 unix 意识形态保持一致,压缩是独立于存档的任务。由于存档是一个文件,因此它可以像任何其他文件一样被压缩。因此,由于您只需要压缩单个文件,因此不需要其他人已经正确指出的 tar。

    但是,您的标题和标签会将未来的读者带到这里,他们可能会期待以下内容......


    假设您有一个完整的文件夹,其中包含要存档和压缩的 PostgreSQL 备份。这仍然应该完全使用 tar 来完成,因为它的 -z--gzip 标志 invokes the gzip tool

    假设您还需要加密您的数据库存档,以准备将它们移至安全可靠的异地备份解决方案(例如与 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 documentation 以了解details of how --null 标志的工作原理以及其他可能需要将文件传输到tar 的情况的有用示例。

    【讨论】:

      【解决方案3】:

      tar不压缩,你要的是gzip或者类似的压缩工具

      【讨论】:

        【解决方案4】:

        Tar 将文件名作为输入。您可能只想像这样 gzip pg_dump 输出:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-11
          • 2010-12-16
          • 1970-01-01
          • 2020-03-11
          • 2016-04-06
          • 1970-01-01
          相关资源
          最近更新 更多