如何将 gzip 压缩文件就地转换为一个 tar.gz 存档?

如何将 gzip 压缩文件就地转换为一个 tar.gz 存档?

我有很多(约 500 万)个小文件,每个文件都用gzip.我想将它们变成一个大tar.gz档案以节省一些空间(元数据),但有一些限制:

  • 我没有足够的空间来解压文件并再次压缩到tar.gz,所以我必须这样做到位。减速比相当不错,大约15:1。
  • 我不能使用太多 CPU 时间,因此重新压缩可能需要很长时间。
  • 文件无法移动到其他地方或删除,因为重要的安全原因

所以。我能做些什么?

答案1

您不必压缩存档,只需将已经压缩的文件添加到其中即可。

tar -cf archive.tar directory_with_compressed_files

答案2

如果只有足够的空间来保存少量文件,您可以分块进行归档,如果需要,甚至可以自动化。假设您的文件存储如下:

.
+-dir0000
| +-file0000.gz
| +-file0001.gz
| [...]
+-dir0001
| +-file1000.gz
| +-file1001.gz
[...]

对于每个目录,运行(从文件的共享根目录):

tar rf /path/to/archive_name.tar dir_name
rm -r dir_name

如果您同意自动执行此操作(我尝试过并且有效,但您收到find可以忽略的错误消息),请尝试以下操作:

find * -maxdepth 1 -type d -exec sh -c "tar rf /path/to/archive_name '{}' && rm -r '{}'" \;

(像往常一样,首先在测试目录结构上尝试此操作,以便您可以验证它正在执行您想要的操作!)

我引用了{}以防你的目录有空格。如果您有平面文件结构,那么您可以做类似的事情,只是没有-type d.确保不要+在 的末尾使用-exec,否则find会尝试一次处理一大堆文件/目录,这首先就破坏了将归档分成几部分的意义!

最终所有文件都将被移至存档中。虽然会很慢,但是可以做到。

相关内容