从多个子目录解压和 gzip

从多个子目录解压和 gzip

我有一个由多个子目录组成的目录。每个子目录都有一个tar.gz文件,解压后会提供两个文件,即R1.fastqR2.fastq。我想在管道传输后立即解压 tar 文件并压缩R1.fastqR2.fastq并将每个子目录的输出保存到另一个 SINGLE 目录中。

 sourcedir=/sdir
 destdir=/ddir

 for f in $sourcedir/*; do
    fbase=${f##*/}   
    echo "Inside $fbase"
 tar -xvf $f/*.gz |gzip -n9 $f/*.fastq > $destdir/
done

我写了上面的代码,但它一直持续到命令为止echo

答案1

$f/*.fastq调用该行时, 与任何内容都不匹配。但主要问题是它tar不会提取到标准输出,它会创建文件(需要某种方式来告诉管道另一端的“接收”一个文件结束而另一个文件开始,并且没有)至少不是tar)。

所以使用时tar必须先tar创建文件,然后gzip再创建创建的文件。

如果文件适合内存,您可以使用 Pythontarfilegzip模块编写快速脚本,并且永远不要让未压缩的代码接触光盘。 IIRC 各个文件被完全提取,因此要使其工作,它们必须适合内存。

答案2

一般方法是从存档中读取文件名(除非它们始终相同),然后tar一次仅提取一个文件。 GNUtar有一个选项--to-stdout可以阻止它写入文件。如果没有它,您将需要每个文件名都有一个 FIFO。

> tar -tf subdir.tar.gz
R1.fastq
R1.fastq

tar -xf subdir.tar.gz --to-stdout R1.fastq | gzip -n9 >/path/to/R1.fastq.gz
tar -xf subdir.tar.gz --to-stdout R2.fastq | gzip -n9 >/path/to/R2.fastq.gz

相关内容