我有"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
但是压缩文件的提取不起作用,它只是下载它们。
有什么建议吗?
管道获取左侧命令的 stdout,并将其发送到右侧命令的 stdin。在这里,我们必须将rsync
的标准输出和管道带到gunzip
的标准
。如果没有-v
标志,rsync
实际上不会输出太多,因此您必须添加它。它现在将吐出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 -rv ./ ../viral | awk '!NF{endFileList=1} NR>1 && endFileList!=1{print "../viral/"$0}'
现在我们有 rsync 和 awk 吐出一个被发送到 TO 目录的文件名列表。现在我们需要gunzip
来处理该列表。不幸的是,gunzip
无法接收文件列表。如果你gunzip
发送一些东西到它的stdin
它会假设该流是一个压缩的流,并会尝试将其压缩。
相反,我们将采用您上面xargs
方法获取 stdin 并将其作为所需的参数(文件名)输入gunzip
:
rsync -rv ./ ../viral | awk '!NF{endFileList=1} NR>1 && endFileList!=1{print "../viral/"$0}' | xargs -l1 gunzip
很可能您必须对此进行一些调整,以确保您正在压缩正确的文件(您的 FROM 位置文件或您的 TO 位置文件)。显然,如果您要同步到SSH的远程计算机,这会变得更加棘手。不确定这是否可以通过管道传输。