Como copiar links simbólicos?

156

Eu tenho um diretório que contém alguns links simbólicos:

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

Eu preciso copiá-los para o diretório atual. Os links resultantes devem ser independentes de seus protótipos e levar diretamente a seus objetos de destino.

  • cp -s cria links para links que não são apropriados.
  • cp -s -L se recusa a copiar links para diretórios
  • cp -s -L -r se recusa a copiar links relativos para o diretório que não funciona

O que devo fazer?

    
por Basilevs 07.05.2010 / 06:36

9 respostas

174
cp --preserve=links

Da página do manual:

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

Pessoalmente, uso cp -av para a maioria das minhas cópias pesadas. Dessa forma, posso preservar tudo - até recursivamente - e ver a saída. Claro, isso é apenas preferência pessoal.

Por que suas outras opções não fizeram o que você esperava, -s cria um link em vez de copiar e -L segue os links na origem para localizar o arquivo a ser copiado em vez de copiando os próprios links.

    
por 07.05.2010 / 07:02
34

Assim como a página man diz, use -P .

    
por 07.05.2010 / 06:39
26

Se os links contiverem caminhos relativos, a cópia do link não ajustará o caminho relativo. Use readlink , com a opção -f a seguir recursivamente, para obter o caminho absoluto do link. Por exemplo:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

Se preservar os caminhos relativos é o que você quer, então a opção -P de cp , como dito por Ignacio Vazquez-Abrams, é o que você precisa.

    
por 07.05.2010 / 07:09
19

Como alguns comentaram:

cp -a 

funciona bem.

Do homem:

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE
    
por 27.01.2015 / 15:51
9

Eu usei o seguinte para duplicar um diretório realmente grande. Todos os links simbólicos foram preservados, a cópia foi feita de forma recursiva e eu pude ter algum feedback visual do processo:

cp -Prv /sourcer_dir/* /target_dir
    
por 15.05.2012 / 19:25
8

Na maioria das vezes, quando eu preciso copiar muitos links simbólicos, estou realmente tentando espelhar uma árvore de diretórios. Então eu quero os links simbólicos e tudo mais.

Isso é um exagero para copiar apenas alguns links simbólicos, mas se você estiver realmente tentando copiar uma árvore inteira, isso pode ser muito útil:

Use tar .

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar não resolve o symlink por padrão, então os links simbólicos na cópia espelhada apontarão para os mesmos locais que os da árvore original.

Este truque faz uso de subshells para colocar o comando tar na posição na raiz do diretório a ser espelhado; você pode deixar um deles fora (junto com o comando cd ) se você já estiver nos diretórios src ou 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 [email protected] '( cd /path/to/dest ; tar xf - )'

Novamente, isso não é apropriado para todas as vezes que você deseja copiar links simbólicos, mas é um snippet muito útil para saber.

    
por 07.05.2010 / 08:03
3

Experimente: cp -pr destino do symlink

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

OS - Centos 5 (Linux)

    
por 27.07.2011 / 15:15
1

No Ubuntu ao copiar links e arquivos em um diretório:

cp --no-dereference --preserve=links
    
por 01.12.2015 / 13:51
0

cp -s e cp -L são comandos especiais. Para sua exigência, use nenhum.

por exemplo. Copiando um diretório DIR contendo ae um link simbólico b apontando para a.

  • cp -s DIR / * N / cria um link simbólico em vez de copiar, N / a- > .. / DIR / a (link) e N / b- > (../ DIR / b) que é o link para um link
  • cp -L DIR / * N / cópias com desreferência de links, N / a, N / b (o mesmo que DIR / a)

O que você precisa é N / d (= DIR / a) e N / b- > .. / N / a; então apenas copie sem desreferenciação, usando a opção cp -P. Eu acredito que este é também o padrão para cp.

  • -P no-dereference, preservar links
  • -d combina a opção -P com -p para preservar = modo, propriedade, registros de data e hora
  • -a combina a opção -d com -R para copiar diretórios recursivamente

consulte man cp ou cp --help para mais opções.

    
por 26.06.2018 / 05:24