当我提取档案时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 直接通过管道传输到它(例如通过tar
tar ... 2> /tmp/tar-stderr.txt
cp
chmod +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,以了解更多详细信息。
希望分享这一经验以防其他人认为它有用。