【问题标题】:how to convert multiline linux commands to one line of command如何将多行linux命令转换为一行命令
【发布时间】:2011-10-31 07:06:47
【问题描述】:

谁能解释一下如何使用“>”和“|”请在linux命令中将这三行转换为一行代码?

mysqldump --user=*** --password=*** $db --single-transaction -R > ${db}-$(date +%m-%d-%y).sql
tar -cf ${db}-$(date +%m-%d-%y).sql.tar ${db}-$(date +%m-%d-%y).sql
gzip ${db}-$(date +%m-%d-%y).sql.tar
rm ${db}-$(date +%m-%d-%y).sql (after conversion I guess this line will be useless)

【问题讨论】:

    标签: mysql linux shell mysqldump


    【解决方案1】:

    GNU tar 程序可以自己进行通常由gzip 完成的压缩。您可以使用-z 标志来启用它。所以targzip 可以组合成:

    tar -zcf ${db}-$(date +%m-%d-%y).sql.tar.gz ${db}-$(date +%m-%d-%y).sql
    

    tar 从标准输入中读取以进行归档并不是一项简单的任务,但我会质疑它在这种特殊情况下的必要性。

    tar 的目的是能够将大量文件打包到一个存档文件中,但是,因为它只是您正在处理的一个文件(来自mysqldump 的输出流),所以您不需要需要tar,你可以直接把它输入gzip本身:

    mysqldump blah blah | gzip > ${db}-$(date +%m-%d-%y).sql.gz
    

    那是因为gzip 如果你不给它任何文件名,它将把标准输入压缩成标准输出。

    这消除了压缩过程中对任何(可能非常大的)临时文件的需要。

    【讨论】:

    • .tgz 扩展名在提取时出错。我想应该是 .gz 吧?
    • @Ergec:抱歉,是的,那是我还在使用 tar 时剪切粘贴操作的后遗症。现已修复。
    • "tar 从标准输入中读取以进行归档并不是一项简单的任务" -- 我只是通过创建指向/dev/stdin 的符号链接来尝试这个,但是tar 文件中的相应条目显示为空。 (我几乎松了一口气。)
    【解决方案2】:

    您可以使用下一个脚本:

    #!/bin/sh
    USER="***"
    PASS="***"
    DB="***"
    
    mysqldump --user=$USER --password=$PASS $DB --single-transaction -R | gzip > ${DB}-$(date +%m-%d-%y).sql.gz
    

    您可以了解更多关于“|”的信息在这里-http://en.wikipedia.org/wiki/Pipeline_(Unix)。我可以说这种构造将 mysqldump 命令的输出移动到 gzip 命令的标准输入,就像您通过管道将一个命令的输出与另一个命令的输入连接起来一样。

    【讨论】:

    • 这会给你一个 gzip 压缩的 sql 文件,而不是一个包含 sql 文件的 gzipped tarball。正如@paxdiablo 所说,这可能没问题(但*.tgz 文件可能有特定要求)。
    • @keith,看来我不需要 tar 但这是另一个好问题,在什么情况下我可能需要 tar?
    • @Ergec:我不知道具体,但您可能有一些工具需要*.tgz 文件并且无法处理.gz 文件。如果你不这样做,那就太好了;别担心。
    【解决方案3】:

    我看不出使用 tar 的意义:您只有一个文件,而对于压缩,您显式调用 gzip。 Tar 用于将多个文件归档/打包为一个。

    你的cammandline应该是(转储命令是短的,但我想你会明白的):

    mysqldump .... | gzip > filename.sql.gz
    

    【讨论】:

      【解决方案4】:

      为了将命令附加到一行中,我将 && 放在它们之间。这样,如果一个失败,它就会停止执行它们。您还可以在每个命令后使用分号,在这种情况下,无论前面的命令是否失败,每个命令都会运行。

      您还应该知道 tar 会使用“z”选项为您执行 gzip,因此您不需要额外的命令。

      Paxdiablo 提出了一个很好的观点,即您可以将 mysqldump 直接通过管道传输到 gzip。

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 2013-11-07
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多