为什么这个档案无法创建符号链接?

为什么这个档案无法创建符号链接?

当我提取档案时Symfony_Standard_2.2.1.tgz使用此命令:

$ tar xzf /home/tomas/downloads/Symfony_Standard_2.2.1.tgz

我总是收到以下错误:

tar:doctrine.php:无法创建到“../vendor/doctrine/orm/bin/doctrine.php”的符号链接:操作不受支持
tar:doctrine:无法创建到“../vendor/doctrine/orm/bin/doctrine”的符号链接:操作不受支持
tar:由于先前的错误,以失败状态退出

为什么无法创建符号链接?


$ tar--version
tar(GNU tar)1.23
版权所有 (C) 2010 自由软件基金会,Inc.
许可证 GPLv3+:GNU GPL 版本 3 或更高版本。
这是免费软件:您可以自由更改和重新分发它。
在法律允许的范围内,不提供任何担保。

由 John Gilmore 和 Jay Fenlason 撰写。
$ lsb_release-a
无可用的 LSB 模块。
分销商 ID:Debian
描述:Debian GNU/Linux 6.0.7 (压缩)
版本:6.0.7
代号:挤压

答案1

皮尔萨的评论说明了一切。我没有考虑到我正在使用具有 NTFS 分区的 Windows 计算机处理 VMware 共享文件夹这一事实。在虚拟机上的任何位置提取存档都可以正常工作。

答案2

我来晚了,但昨天也遇到了同样的问题。如果文件系统不支持符号链接,而你仍然希望可以访问存档中的所有内容,那么复制这些文件(应该是符号链接)可能是一种解决方法。

我想要提取的存档有 20 多个符号链接,所以我决定cp通过脚本生成命令。我只需要提供(通过文件)stderr的输出和目标文件夹。我决定暂时不执行命令,而是将它们通过管道传输到一个文件,这样我就可以先检查一下,然后再执行。欢迎改进脚本,将 tar 直接通过管道传输到它(例如通过tartar ... 2> /tmp/tar-stderr.txtcpchmod +x交换stdout/stderr),以某种方式使用tee来提供被忽略的消息tar...

#!/bin/sh
(export DIR=/your/extraction/target/directory; echo \#\!/bin/sh -e; cat /tmp/tar-stderr.txt | grep 'Cannot create symlink to' | sed -e 's7^tar: \.\([^:]\+\): Cannot create symlink to .\([^:]\+\).*$7\1:\27' -e "s7^\(.\+\)/\([^:]\+\):\(.\+\).\$7cd $DIR\1 \&\& cp \3 \2;7")

编辑:添加脚本解释:

过滤grep感兴趣的行。我的sed命令很简单,但使用7而不是常见的 作为字段分隔符/。通过这个,我可以搜索和/或写入/

第一个sed表达式过滤相关信息(相对路径和 2 个文件名)并使用 a作为分隔符。第二个表达式将文件名与路径区分开来,并在最后:丢弃;最终输出是一个命令。'cp

答案3

我遇到了类似的问题,我想将一个大文件夹从一个硬盘复制到一个新硬盘,但我花了一段时间来考虑不同的分区格式。

原始文件位于ext4格式化分区上,提取位置是格式化为的外部驱动器exFat。一旦我意识到这一点,我就将外部硬盘驱动器格式化为 ext4,并且它起作用了,但我还使用了-h取消引用符号链接的标志。

tar -xhf myfolder.tar

我使用的是 Ubuntu 22.04,以了解更多详细信息。

希望分享这一经验以防其他人认为它有用。

相关内容