Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用rsync下载,使用gunzip解压缩,并将所有内容放在一个管道中_Linux_Shell_Pipe_Rsync_Gunzip - Fatal编程技术网

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

Linux 使用rsync下载,使用gunzip解压缩,并将所有内容放在一个管道中,linux,shell,pipe,rsync,gunzip,Linux,Shell,Pipe,Rsync,Gunzip,我有使用“rsync”下载的“gz”文件。然后,在压缩这些文件时,我需要使用gunzip提取它们(我对gunzip的任何其他替代方案都持开放态度)。我想将所有这些命令放在一个管道中,以获得类似于rsync文件| gunzip 我的原始命令如下: awk-F“\t”'$5~/^(参考基因组|代表基因组)$/{sub(“ftp”,“rsync”,“20”);b=$20/*genomic.fna.gz;print b“viral/”}assembly\u summary\u viral.txt | x

我有使用“rsync”下载的“gz”文件。然后,在压缩这些文件时,我需要使用gunzip提取它们(我对gunzip的任何其他替代方案都持开放态度)。我想将所有这些命令放在一个管道中,以获得类似于
rsync文件| gunzip

我的原始命令如下:
awk-F“\t”'$5~/^(参考基因组|代表基因组)$/{sub(“ftp”,“rsync”,“20”);b=$20/*genomic.fna.gz;print b“viral/”}assembly\u summary\u viral.txt | xargs-l1 rsync--复制链接--时间--递归--详细--排除=“*rna*”--exclude=“*cds*”

它看起来有点复杂,但它正在下载我需要的文件,而且没有问题。我添加了
|gunzip
,但是压缩文件的提取不起作用,它只是下载它们


有什么建议吗?

管道获取左命令的stdout并将其发送到右命令的stdin。在这里,我们必须使用
rsync
的标准输出并通过管道连接到
gunzip
的标准输出

rsync
在没有
-v
标志的情况下实际上不会有太多输出,因此您必须添加它。它现在将向标准输出如下内容:

>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和awk,列出了发送到to目录的文件名列表。现在我们需要使用
gunzip
来处理该列表。不幸的是,
gunzip
无法接收文件列表。如果您向它的
stdin
发送
gunzip
内容,它将假定该流是一个gzip流,并将尝试对其进行压缩

相反,我们将采用上面的
xargs
方法,将stdin作为它所需的参数(文件名)输入到
gunzip

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

最有可能的情况是,您必须对此进行一些调整,以确保您正在压缩正确的文件(从位置文件或到位置文件)。显然,如果您正在与SSH的远程计算机进行rsyncing,这会变得更加棘手。不确定是否可以通过管道传输。

管道将stdout重定向到管道后面命令的stdin。我假设rsync命令的stdout不是
gunzip
可以使用的东西。我还想知道
xargsrsync
是如何工作的。漂亮。我不是shell命令专家。。。但是,当我试图通过管道传输awk的输出时,我在互联网上找到了脚本xargs rsync,它可以工作!
 rsync -rv ./ ../viral | awk '!NF{endFileList=1} NR>1 && endFileList!=1{print "../viral/"$0}' | xargs -l1 gunzip