Apache Commons Compress 无法在 tar 中添加硬链接

Posted

技术标签:

【中文标题】Apache Commons Compress 无法在 tar 中添加硬链接【英文标题】:Apache Commons Compress unable to add hard link in tar 【发布时间】:2017-02-12 06:14:12 【问题描述】:

我有一组文件,其中有一些指向某些文件的硬链接。 例如:

/tmp/test/file1
/tmp/test/file1_Link

file1 是一个大小为 1 MB 的文件。 file1_Link 是指向file1 的硬链接

当我使用 unix tar 命令压缩这两个文件时,生成的存档大小为 1 MB (mytar.tar)

tar -cvf ../mytar.tar .
-rw-r--r--  1 bsarraf  189060905   1.0M Feb 11 22:06 mytar.tar
-rw-r--r--  1 bsarraf  189060905   2.0M Feb 11 22:10 files.tar

但是,当我使用 apache commons 压缩并添加 tar 文件中的所有文件时,我得到一个大小为 2 MB (files.tar) 的 tar。

这意味着在 tar 中同一个文件被添加了两次。

如何将 tar 中的硬链接文件添加为其他文件的硬链接?

【问题讨论】:

您没有显示您的代码。我相信您必须自己检测硬链接并处理链接条目的创建(在 tar 文件中)。 org.apache.commons.compress.archivers.tar.TarConstants 包含软 (LF_SYMLINK) 和硬 (LF_LINK) 链接的类型常量。 感谢@JimGarrison 的回复。我通过一些实验解决了这个问题。 【参考方案1】:

对于可能遇到相同问题的其他人,我能够使用以下方法解决问题: 1.确定文件是否为硬链接,有多种方法可以做到这一点。 2.一旦识别出hardlink,使用以下方法将hardline文件添加到tar中

private void addLinkFileToTar(TarArchiveOutputStream tar, File linkFile, File file, String base)
        throws IOException 
    String entryName = base + linkFile.getName();
    TarArchiveEntry tarEntry = new TarArchiveEntry(entryName, TarConstants.LF_LINK);
    tarEntry.setLinkName(base+file.getName());
    tar.putArchiveEntry(tarEntry);
    tar.closeArchiveEntry();

这里的linkFile是硬链接文件,file是目标文件。

【讨论】:

以上是关于Apache Commons Compress 无法在 tar 中添加硬链接的主要内容,如果未能解决你的问题,请参考以下文章

程序员的福音 - Apache Commons Compress

commons-compress(apache压缩工具包)

Flink SQL ClassNotFoundException: org.apache.commons.compress.compressors.zstandard.ZstdCompressorIn

How to untar a TAR file using Apache Commons

Java解压tar.Z文件(使用Apache Commons-compress)

Apache Commons Compress 无法在 tar 中添加硬链接