Questão Como copiar links simbólicos?


Eu tenho 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 aos seus objetos de destino.

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

O que devo fazer?


147


origem


cp -d fez o trabalho do meu lado. - m-ric
cp -R em um mac - Mirko


Respostas:


cp --preserve=links

Na página man:

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

Pessoalmente, eu 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 faz um link em vez de de copiar e -L segue os links na fonte para encontrar o arquivo a ser copiado, em vez de copiar os próprios links.


167



Você pode precisar adicionar -Rporque senão o cp irá pular diretórios e links simbólicos para diretórios. - Olivier 'Ölbaum' Scherler
Eu tentei isso no redhat e não funciona - Mansuro
em um Mac? usar cp -a - Steve Tauber
+1 para o -a opção. Heh, eu procurei opções em cpmanpage inúmeras vezes, ainda devo ter sempre desnatado sobre este. Eu tenho até agora usado -dpr, mas -a abrange todos esses, além da preservação de um par de outros atributos. Se eu precisasse desses outros atributos, provavelmente teria procurado --preserve opção novamente e usado -dr --preserve=all, que é exatamente o que -a é! Bem, pelo menos eu sei agora - -a é perfeito e é isso que eu vou usar a partir de agora. - James Haigh
Isso não funcionou no Cygwin. --preserve=links não foi o suficiente. Ainda dizia cp: omitting directory. Mas -av trabalhado. - Chloe


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


32



no Mac -P não funciona em diretórios, então eu usei cp -a - Steve Tauber
Obrigado, eu já vi e aproveitei sua resposta 3 vezes agora em diferentes momentos ao longo de um ano. Parece que não consigo lembrar! - Siddhartha
Isso funciona, mas meu man page diz "-P nunca siga links simbólicos em SOURCE", que não é intuitivamente o mesmo que "copiar links simbólicos como links simbólicos para o destino". ("never follow" faz parecer que funciona em combinação com -R) - R.M.
este cp -P ao contrário do top votado responder por @kainosnous funciona para mim. Obrigado! - tommy.carstensen
Funciona no Redhat. A resposta aceita não funciona! - Phiber


Se os links contiverem caminhos relativos, a cópia do link não ajustará o caminho relativo. Usar readlinkcom o interruptor -f seguir recursivamente, a fim de 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 do cp, como dito por Ignacio Vazquez-Abrams, é o que você precisa.


26



Pode ser uma má ideia excluir a referência recursivamente se tudo o que você está tentando fazer é converter os links simbólicos de absolutos. A recursão não é necessária aqui, e às vezes links encadeados estão lá por um motivo. Os links simbólicos são geralmente usados ​​para especificar opções ou opções de configuração. Por exemplo, no meu sistema há uma cadeia de links simbólicos /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english que especifica o dicionário preferido. Se você fizesse uma referência recursiva a essa cadeia, o link simbólico resultante ignoraria qualquer mudança futura nessa preferência. - James Haigh


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

16



... mas somente se nenhum dos links simbólicos for para caminhos relativos. - Michael Scheper


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

cp -Prv /sourcer_dir/* /target_dir

9





Na maioria das vezes, quando eu preciso copiar muitos links simbólicos, estou 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:

Usar alcatrão.

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

alcatrão 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 obter o alcatrão comando na posição na raiz do diretório a ser espelhado; você pode deixar um deles fora (junto com o associado CD comando) se você já está no src ou dest diretórios:

# 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 - )'

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


8



tar é definitivamente mais portátil do que cp na minha experiência - don bright


Experimentar: cp -pr destino de links simbólicos

[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)


3





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

cp --no-dereference --preserve=links

1



cp -d é a abreviatura para este - hunse


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 é um 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 / a (= 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, preserve links
  • -d combina a opção -P com -p para preservar = modo, propriedade, data e hora
  • -a combina a opção -d com -R para copiar diretórios recursivamente

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


0