我有一个由多个子目录组成的目录。每个子目录都有一个tar.gz
文件,解压后会提供两个文件,即R1.fastq
和R2.fastq
。我想在管道传输后立即解压 tar 文件并压缩R1.fastq
,R2.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
再创建创建的文件。
如果文件适合内存,您可以使用 Pythontarfile
和gzip
模块编写快速脚本,并且永远不要让未压缩的代码接触光盘。 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