2011-10-31 106 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