代码之家  ›  专栏  ›  技术社区  ›  kikito

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

  •  13
  • kikito  · 技术社区  · 15 年前

    我正在尝试找出一种在Ubuntu服务器LTS上使用tar+管道的方法。

    我有一个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 U倾卸 作为焦油的输入?或者我只是出了点问题?

    4 回复  |  直到 13 年前
        1
  •  31
  •   Pointy    15 年前

    我根本看不到“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”实用程序 只是 压缩;它不构成档案。

        2
  •  7
  •   Alec Wenzowski    13 年前

    在您的用例中 pg_dump 只创建一个需要压缩的文件。正如其他人所暗示的,在*nix-land中,存档是表示文件系统的单个文件。符合Unix的思想 每个任务一个工具 ,压缩是独立于存档的任务。因为归档文件是一个文件,所以它可以被压缩,任何其他文件也是如此。因此,由于您只需要压缩一个文件,所以不需要tar,因为其他人已经正确地指出了这一点。

    然而,你的标题和标签将带着未来的读者来这里,他们可能期待着以下…


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

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

    在这种情况下,您可能希望通过管道将数据传输到tar或从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
  •  2
  •   Mathieu    15 年前

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

        4
  •  2
  •   vezult    15 年前

    tar将文件名作为输入。您可能只想gzip pg_dump输出,如下所示:

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