3

Когда я извлекаю архив Symfony_Standard_2.2.1.tgz с помощью этой команды:

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

Я всегда получаю ошибки:

tar: doctrine.php: Cannot create symlink to `../vendor/doctrine/orm/bin/doctrine.php': Operation not supported
tar: doctrine: Cannot create symlink to `../vendor/doctrine/orm/bin/doctrine': Operation not supported
tar: Exiting with failure status due to previous errors

Почему не удается создать символические ссылки?


$ tar --version
tar (GNU tar) 1.23
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 6.0.7 (squeeze)
Release:        6.0.7
Codename:       squeeze

2 ответа2

4

В комментарии BloodPhilia все сказано. Я не учел тот факт, что я работаю над общей папкой VMware с машины Windows с разделами NTFS. Распаковка архива в любом месте на виртуальной машине работает нормально.

0

Я немного опаздываю на эту вечеринку, но вчера у меня была та же проблема. Если файловая система не поддерживает символические ссылки, и вы, тем не менее, хотите, чтобы все содержимое архива было доступно, это может быть обходной путь для копирования этих файлов (которые должны быть символическими ссылками).

В архиве, который я хотел извлечь, было более 20 символических ссылок, поэтому я решил сгенерировать команды cp с помощью скрипта. Мне просто нужно предоставить stderr вывод tar (через файл tar ... 2> /tmp/tar-stderr.txt) и целевую папку. Я решил пока не выполнять команды cp , но направить их в файл, который я могу проверить, прежде чем выполнить chmod +x и выполнить его. Не стесняйтесь улучшать сценарий, направляйте tar напрямую к нему (например, путем обмена 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 фильтрует релевантную информацию (относительный путь и два имени файла) и ставит : как разделитель. Вторая отличает имя файла от пути и выбрасывает ' в самом конце; окончательный результат - команда cp .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .