2017-06-02 50 views
0

我有使用「rsync」下載的「gz」文件。然後,當這些文件被壓縮時,我需要使用gunzip來提取它們(我可以使用gunzip的任何其他替代方法)。我希望把所有這些命令一起到管道有類似的東西rsync file | gunzip使用rsync下載並使用gunzip解壓縮,並將所有內容放在一個管道中

我原來的命令如下: awk -F "\t" '$5~/^(reference genome|representative genome)$/ {sub("ftp", "rsync", $20); b=$20"/*genomic.fna.gz"; print b" viral/." }' assembly_summary_viral.txt | xargs -l1 rsync --copy-links --times --recursive --verbose --exclude="*rna*" --exclude="*cds*"

它看起來有點複雜,但它的下載,我需要的文件,並沒有問題。我添加了| gunzip但是,壓縮文件的提取不起作用,只能下載它們。

有什麼建議嗎?

+0

管道將stdout重定向到管道後面命令的stdin。我假設rsync命令的stdout不是'gunzip'可以使用的。我也想知道'xargs rsync'是如何工作的。俏皮。 – JNevill

+0

我不是shell命令的專家......但是,當我嘗試管道awk的輸出時,我發現腳本xargs rsync通過互聯網,並且它工作正常! – dabid

回答

0

一個管道使用左側命令的stdout並將其發送到右側命令的stdin。在這裏,我們必須將標準輸出爲rsync,並將其輸入gunzip的標準輸入。

rsync如果沒有-v標誌就不會輸出太多,因此您必須添加該標誌。現在會吐出來stdout類似以下內容:

>rsync -rv ./ ../viral 
sending incremental file list 
file1 
file2 
file3 
test1_2/ 
test1_2/file1 
test1_2/file2 

sent 393 bytes received 123 bytes 1,032.00 bytes/sec 
total size is 0 speedup is 0.00 

我們可以通過管道將要awk先搶到只有文件路徑/文件名,並在前面加上viral/到它的前面,這樣它gunzips的文件,您只是rsync'd TO(而不是從你rsync'd的那些):

rsync -rv ./ ../viral | awk '!NF{endFileList=1} NR>1 && endFileList!=1{print "../viral/"$0}' 

現在我們的rsync和awk吐出正在發送到TO目錄文件名列表。現在我們需要獲得gunzip來處理該列表。不幸的是,gunzip無法獲取文件列表。如果你發送gunzip的東西到它的stdin它會認爲這個流是一個gzipped流,並且會嘗試對它進行gunzip。

相反,我們會採用該方法xargs你有以上採取標準輸入,並將其送入gunzip作爲參數(文件名),它需要:

rsync -rv ./ ../viral | awk '!NF{endFileList=1} NR>1 && endFileList!=1{print "../viral/"$0}' | xargs -l1 gunzip 

最有可能的,你將不得不調整這一點以確保您正在使用正確的文件(無論是您的位置文件還是您的位置文件)。如果你正在遠程控制SSH遠程計算機,這會變得更加棘手。不確定這是否可以傳送。

相關問題