使用rsync下载并使用gunzip解压缩,并将所有内容放在一个管道中

时间:2017-06-02 18:07:37

标签: linux shell pipe rsync gunzip

我有" gz"我正在使用" rsync"下载的文件。然后,当这些文件被压缩时,我需要使用gunzip来提取它们(我对gunzip的任何其他选择都是开放的)。我想将所有这些命令放在一个管道中,以便有类似rsync file | 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但是压缩文件的提取不起作用,并且只能下载它们。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

管道获取左命令的stdout并将其发送到右命令的stdin。在这里,我们必须使用rsync的stdout并将其传递给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/添加到其前面,以便它将您刚刚rsync'd的文件(而不是您同步的那些):

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

现在我们有rsync和awk吐出一个发送到TO目录的文件名列表。现在我们需要让gunzip来处理该列表。遗憾的是,gunzip无法接收文件列表。如果您向gunzip发送stdin内容,则会认为该流是一个gzip压缩流,并会尝试对其进行解压缩。

相反,我们将使用上面的xargs方法获取标准输入并将其作为所需的参数(文件名)提供给gunzip

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

您很可能需要稍微调整一下以确保您正在解压缩正确的文件(FROM位置文件或TO位置文件)。如果你正在使用SSH远程计算机,这会变得更加棘手。不确定是否可以通过管道输送。