我使用远程计算机上的目录制作了一个 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
都可以毫无错误地提取。所以我认为有两个原因:
tarball 已损坏,请通过以下方式检查:
$ tar -tvf tarball.tar
如果有的话,你会看到一些错误。
您使用“虚拟”文件系统,例如保险丝压缩或者加密文件系统(使用选择性文件压缩/加密)并且您的文件名有点短或等于文件系统限制。诀窍是,当您使用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
就我而言,所有有问题的文件都用元信息对音轨进行了编号,因此剪切一些名称似乎不是问题。你可能需要想办法恢复原来的文件名。