У меня есть каталог, который содержит некоторые символьные ссылки:
user@host:include$ find .. -type l -ls
4737414 0 lrwxrwxrwx 1 user group 13 Dec 9 13:47 ../k0607-lsi6/camac -> ../../include
4737415 0 lrwxrwxrwx 1 user group 14 Dec 9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417 0 lrwxrwxrwx 1 user group 12 Dec 9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419 0 lrwxrwxrwx 1 user group 17 Dec 9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420 0 lrwxrwxrwx 1 user group 19 Dec 9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421 0 lrwxrwxrwx 1 user group 17 Dec 9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat
Я должен скопировать их в текущий каталог. Получающиеся каналы должны быть независимы от своих прототипов и привести непосредственно к своим целевым объектам.
cp -s
создает ссылки на ссылки, который не является соответствующим поведением.cp -s -L
отказывается копировать ссылки на каталогиcp -s -L -r
отказывается копировать относительные ссылки на нерабочий каталогЧто мне делать?
cp --preserve=links
Из страницы справочника:
--preserve[=ATTR_LIST]
preserve the specified attributes (default: mode,owner-
ship,timestamps), if possible additional attributes: context,
links, xattr, all
Лично, я использую cp -av
для большей части моего тяжелого копирования. Тем путем я могу сохранить все - даже рекурсивно - и видеть вывод. Конечно, это - просто персональное предпочтение.
Относительно того, почему Ваши другие опции не сделали то, что Вы ожидали, -s
делает ссылку вместо того, чтобы копировать и -L
переходит по ссылкам в источнике, чтобы найти, что файл копирует вместо того, чтобы копировать сами ссылки.
Если ссылки будут содержать относительные пути, то, копируя ссылку не скорректирует относительный путь. Использовать readlink
, с переключателем -f
следовать рекурсивно, для получения полного пути ссылки. Например:
ln -s $(readlink -f old/dir/oldlink) new/dir/newlink
Если сохранение относительных путей - то, что Вы хотите, чем опция -P
из cp
, как сказано Ignacio Vazquez-Abrams, то, в чем Вы нуждаетесь.
Как в странице справочника говорится, использовать -P
.
Большую часть времени, когда я должен скопировать много символьных ссылок, я на самом деле пытаюсь зеркально отразить дерево каталогов. Таким образом, я хочу символьные ссылки и все остальное.
Это - излишество для копирования всего нескольких символьных ссылок, но если Вы на самом деле пытаетесь скопировать все дерево, это может быть очень полезно:
Используйте tar.
user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )
tar не разрешает символьную ссылку по умолчанию, таким образом, символьные ссылки в зеркальной копии укажут на те же местоположения как те, которые в исходном дереве.
Этот прием использует подоболочки, чтобы заставить команду tar в положение в корне каталога быть зеркально отраженной; можно пропустить одного из них (наряду со связанной командой CD), если Вы уже находитесь в src или dest каталогах:
# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )
# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf -
# just need src/foo?
# this result will be a mirror copy at dest/foo
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )
# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'
Снова, это не является соответствующим в течение каждого раза, когда Вы хотите скопировать символьные ссылки, но это - очень полезный отрывок для знания.