Extrat tar“无法打开:文件名太长”

Extrat tar“无法打开:文件名太长”

我使用远程计算机上的目录制作了一个 tar 文件:

tar -czvf

我将其 scp 到我的本地计算机,我想在那里解压它:

tar -xzvf

但我得到:Cannot open: File name too long

在我的 lubuntu 12.04 本地计算机上,我有: tar (GNU tar) 1.26.

远程计算机现在无法访问,如果需要的话我会检查版本。

我想提取而不必制作新的 tar,特别是因为远程计算机处于离线状态。

顺便说一句,如果你知道一种方法来制作正确的存档,尽管名称很长,我会接受的。

答案1

tar将文件名限制为 256 字节(带 GNU 扩展名)。 Linux 文件系统支持每个文件名至少 256 字节。这意味着任何打包的文件tar都可以毫无错误地提取。所以我认为有两个原因:

  1. tarball 已损坏,请通过以下方式检查:

    $ tar -tvf tarball.tar
    

    如果有的话,你会看到一些错误。

  2. 您使用“虚拟”文件系统,例如保险丝压缩或者加密文件系统(使用选择性文件压缩/加密)并且您的文件名有点短或等于文件系统限制。诀窍是,当您使用fusecompress(例如)挂载目录并创建文件名时,foo.bar虚拟文件​​系统会创建一个名为 的文件foo.bar.gz并透明地压缩它,但对您隐藏真实的文件名。如果您创建一个名称长度为 254 字节的文件,您会收到错误,因为它会尝试向其附加后缀。

    在这种情况下,只需将 tarball 提取到虚拟文件系统之外应该会有所帮助:

    $ sudo mkdir /home/${USER}-temp
    $ sudo chown $USER /home/${USER}-temp
    $ tar -xvf tarball.tar -C /home/${USER}-temp
    

无论如何,尝试追踪它以获取更多信息:

$ strace -o tar-strace.log tar -tf tarball.tar
$ ltrace -o tar-ltrace.log tar -tf tarball.tar

答案2

这是我保存文件的解决方法。提取 tar 时,添加以下选项:

  • 使用--xform'/sed/表达式/' 来缩写长名称。
  • 使用-T文件名列表仅提取有问题的文件而不是所有存档。

例子:

首先将长文件名放入 /tmp/missing.txt 中。

tar -x -T /tmp/missing.txt --xform 's/Beethoven-.*\.flac/B.flac/g' -f backup/home.tar

就我而言,所有有问题的文件都用元信息对音轨进行了编号,因此剪切一些名称似乎不是问题。你可能需要想办法恢复原来的文件名。

相关内容