使用 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但是压缩文件的提取不起作用,它只是下载它们。

有什么建议吗?

管道获取左侧命令的 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的远程计算机,这会变得更加棘手。不确定这是否可以通过管道传输。

相关内容

  • 没有找到相关文章

最新更新