我有" 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
但是压缩文件的提取不起作用,并且只能下载它们。
有什么建议吗?
答案 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远程计算机,这会变得更加棘手。不确定是否可以通过管道输送。