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 aos objetos de destino.
cp -s
cria links para links que não são um comportamento apropriado.cp -s -L
se recusa a copiar links para diretórioscp -s -L -r
se recusa a copiar links relativos para o diretório não ativo
O que devo fazer?
linux
command-line
symbolic-link
cp
Basilevs
fonte
fonte
cp -d
fez o trabalho do meu lado.cp -R
em um macRespostas:
Na página do manual:
Pessoalmente, uso
cp -av
na maioria das minhas cópias pesadas. Dessa forma, posso preservar tudo - mesmo 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 fonte para encontrar o arquivo a ser copiado em vez de copiar os links em si.fonte
-R
, pois, caso contrário, o cp ignorará diretórios e links simbólicos para diretórios.cp -a
-a
opção. Heh, procurei as opções na páginacp
de manual inúmeras vezes, mas devo sempre ter passado por aqui. Até agora, estou usando-dpr
, mas-a
abrange todos eles, além da preservação de alguns outros atributos. Se eu precisasse desses outros atributos, provavelmente teria procurado a--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 vou usar a partir de agora.--preserve=links
não foi suficiente. Ainda diziacp: omitting directory
. Mas-av
funcionou.Assim como a página de manual diz, use
-P
.fonte
-P
não funciona em diretórios então eu useicp -a
cp -P
ao contrário do top votado resposta por obras @kainosnous para mim. Obrigado!Se os links contiverem caminhos relativos, copiar o link não ajustará o caminho relativo. Use
readlink
, com a opção-f
para seguir recursivamente, para obter o caminho absoluto do link. Por exemplo:Se você deseja preservar os caminhos relativos, a opção
-P
decp
, como disse Ignacio Vazquez-Abrams, é o que você precisa.fonte
/usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english
que especifica o dicionário preferido. Se você desresferisse recursivamente essa cadeia, o link simbólico resultante ignoraria quaisquer alterações futuras nessa preferência.Como alguns comentaram:
funciona bem.
Do homem:
fonte
Eu usei o seguinte para duplicar um diretório muito grande. Todos os links simbólicos foram preservados, a cópia foi feita de forma recursiva e pude ter algum feedback visual do processo:
fonte
Na maioria das vezes, quando preciso copiar muitos links simbólicos, na verdade 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:
Use alcatrão .
O tar não resolve o link simbólico por padrão; portanto, os links simbólicos na cópia espelhada apontam para os mesmos locais que os da árvore original.
Esse 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 de fora (junto com o comando cd associado ) se você já estiver nos diretórios src ou dest :
Novamente, isso não é apropriado para toda vez que você deseja copiar links simbólicos, mas é um trecho muito útil para saber.
fonte
Tente: destino de link simbólico cp -pr
OS - Centos 5 (Linux)
fonte
No Ubuntu, ao copiar links e arquivos em um diretório:
fonte
cp -d
é o atalho para issocp -a
ecp --preserve=links
faço mais do que a pergunta está perguntando. Pelo que entendi, esta é a resposta correta para quem usacp
, embora apenas com arquivos (sem diretórios) como na pergunta,--no-dereference
não surtisse efeito.Use a
-P
opção, como Ignacio Vazquez-Abrams escreveu acima . O que ele não mencionou é-P
que não tem efeito sem-R
. Então você precisa pelo menoscp -RP
.(O site não me permite comentar ainda, por isso postei uma resposta separada.)
fonte
cp -s e cp -L são comandos especiais. Para sua exigência, não use nenhum.
por exemplo, copiar um diretório DIR contendo a e um link simbólico b apontando para a.
O que você precisa é N / a (= DIR / a) e N / b -> ../ N / a; então, basta copiar sem desreferenciar, usando a opção cp -P. Eu acredito que este também é o padrão para cp.
consulte
man cp
oucp --help
para mais opções.fonte