如何解压 `.tgz` 目录,并 gzip 内存中提取的文件之一?

How to untar `.tgz` directory, and gzip one of the extracted files in memory?

TL;DR
我怎样才能取消tar 一个文件.tgz,然后有选择地gzip 输出? 我提取的目录有几个文本文件和一个 .nii 文件。我想 gzip 后者。

更多详情
第一种方法是按顺序进行。然而,我正在处理存储在 BeeGFS 文件系统上的巨大数据集(10k+ tar 档案),我被告知最好在内存中而不是分两步完成,因为 BeeGFS 不喜欢处理大这样的目录。

顺序法:

for tarfile in ${rootdir}/*.tgz; do
  tarpath="${tarfile%.tgz}"
  tar zxvf ${tarfile}       # (1) untar directory
  gzip ${tarpath}/*.nii     # (2) gzip the .nii file
done

有没有办法将(1)和(2)结合起来?或者您还有其他关于如何有效执行此过程的提示吗?
谢谢!

您可以从存档中提取单个文件(如果您知道文件名),然后让 tar 将其写入标准输出而不是 -O 的文件,然后压缩该文件流式传输并将 it 重定向到文件。像

tar xzOf "$tarfile" "$tarpath/foo.nii" | gzip -c > "$tarpath/foo.nii.gz"

然后您可以使用 tar xzf "$tarfile" --exclude "*.nii"

提取存档中的所有其他内容