2017-06-02 51 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远程计算机,这会变得更加棘手。不确定这是否可以传送。

相关问题