使用rsync下载并使用gunzip解压缩,并将所有内容放在一个管道中
我有使用“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
但是,压缩文件的提取不起作用,只能下载它们。
有什么建议吗?
一个管道使用左侧命令的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远程计算机,这会变得更加棘手。不确定这是否可以传送。
管道将stdout重定向到管道后面命令的stdin。我假设rsync命令的stdout不是'gunzip'可以使用的。我也想知道'xargs rsync'是如何工作的。俏皮。 – JNevill
我不是shell命令的专家......但是,当我尝试管道awk的输出时,我发现脚本xargs rsync通过互联网,并且它工作正常! – dabid