2011-10-31 126 views
2

有人可以请解释我如何使用“>”和“|”在Linux命令中,并将这三行转换为一行代码?如何将多行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) 

回答

2

的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将压缩标准输入到标准输出,如果你不给它任何文件名。

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

+0

.tgz的扩展提供了错误。我想它应该是.gz对不对? – Ergec

+0

@Ergec:对不起,是的,当我还在使用焦油时,那是一次切割“粘糊糊”操作的宿醉。现在修复。 – paxdiablo

+0

“_Getting'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命令的标准输入,这就像你通过管道连接一个命令的输出和另一个命令的输入。

+0

这给你一个gzipped的sql文件,而不是一个包含sql文件的gzipped tarball。正如@paxdiablo所说,这*可能*好(但可能对'* .tgz'文件有特定要求)。 –

+0

感谢您的回答,投了票。 – Ergec

+0

@keith,似乎我不需要焦油,但这是另一个很好的问题,在什么情况下我可能需要焦油? – Ergec

0

要在一行中追加命令,我会在它们之间放置& &。这样,如果一个失败,它会停止执行它们。您也可以在每个命令之后使用分号,在这种情况下,无论先前的命令是否失败,每个命令都会运行。

你也应该知道tar会用“z”选项为你做gzip,所以你不需要额外的命令。

Paxdiablo提供了一个很好的观点,您可以直接将mysqldump传递给gzip。

2

我没有看到使用tar的要点:你只需要一个文件,而对于压缩,你可以直接调用gzip。 Tar用于将多个文件归档/打包成一个文件。

您cammandline应(dump命令短路,但我猜你会得到它):在提取

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