我有一个压缩的 tarball(例如foo.tar.gz
),我希望从中提取所有文件,但 tarball 中的文件未压缩。也就是说,内容foo.tar.gz
是未压缩的txt
文件。
我的文件系统上没有足够的空间来直接提取文件,因此我希望提取这些文件并在将它们写入磁盘时立即压缩它们。我不能简单地提取文件,然后对提取的文件进行 gzip,因为正如我所说,文件系统上没有足够的空间。我还想确保原始文件名(包括其目录)忠实地保留在磁盘上。因此,如果 tarball 中的文件之一是/a/b/c/foo.txt
,那么在该过程结束时我希望/a/b/c/foo.txt.gz
我怎样才能做到这一点?
答案1
它不会很快,特别是对于包含大量文件的大型 tarball,但在 bash 中你可以这样做:
tar -tzf tarball.tgz | while IFS= read -r file; do
tar --no-recursion -xzf tarball.tgz -- "$file"
gzip -- "$file"
done
第一个 tar 命令提取 tarball 中的文件名称,并将这些名称传递给循环while read ...
。然后,文件名被传递给第二个 tar 命令,该命令提取只是那个文件,然后在提取下一个文件之前对其进行压缩。使用该--no-recursion
标志是为了尝试提取目录不会提取该目录下的所有文件,而 tar 通常会执行此操作。
您仍然需要足够的可用空间来存储比压缩 tarball 的原始大小稍大的空间。