Como copiar links simbólicos relativos e manter alvos

4

Minha situação tem dois diretórios: / blah / d01 e / blah / d02

$ls -l /blah/d01
a/
b/
c/
fa -> a
fb -> b
fc -> c

e eu quero copiar fa, fb, fc para / blah / d02 e, como resultado:

$ls -l /blah/d02
fa -> ../d01/a
fb -> ../d01/b
fc -> ../d01/c

o ponto é, eu quero fazer algo parecido com cp - {algum atributo mágico} / blah / d01 / f * / blah / d02 / para fazer isso acontecer.

Obrigado

UPDATE

Eu decidi com um script bash:

#! /bin/bash
for i in $@; do echo $i && [ -L $i ] && ln -s $(dirname $i)/$(readlink $i) $(basename $i); done

que criam novos links com base nos antigos (certifique-se de que eles usem o caminho relativo)

ATUALIZAR NOVAMENTE

Eu encontrei meu último script funcionando, mas o caminho do link seria desajeitadamente longo (cheio de caminhos relativos estranhos) depois de copiar links simbólicos de a para b e de bec para, então eu adicionei algo para limpar o caminho relativo , e o script termina:

#! /bin/bash
function relpath {
  source=$1
  target=$2

  common_part=$source
  back=
  while [ "${target#$common_part}" = "${target}" ]; do
    common_part=$(dirname $common_part)
    back="../${back}"
  done

  echo ${back}${target#$common_part/}
}

for i in $@; do echo $i && [ -L $i ] && ln -s $(relpath $PWD $(readlink -f $i)); done
    
por tdihp 24.07.2012 / 09:53

2 respostas

2

Como esses links simbólicos são criados sem caminho completo qualificado, isso é uma coisa difícil de fazer com cp . Mas você pode criar novos no alvo:

for i in *; do [ -L $i ] && cd blah && ln -s ../$i $i && cd -; done

Uma breve explicação:

  • for i in * : faz um loop sobre a lista de arquivos / diretórios no local atual
  • do : encapsula o que deve ser feito
  • [ -L $i ] && : continue apenas se a entrada atual for um link simbólico
  • cd blah && ln -s ../$i $i && cd - : mude para blah e crie links simbólicos para o local original

Isso ainda não é exatamente o que você quer (pois vincula simbolicamente os links simbólicos). Então vamos modificar um pouco:

for i in *; do [ -L $i ] && cd blah && ln -s ../$(readlink ../$i) $i && cd -; done

A construção adicionada $(readlink ../$i) avalia o objeto para o qual o link aponta e coloca o resultado lá. Et voila - o resultado é o que você procurava.

Note que eu simplifiquei um pouco seu pedido (fazendo com que você queira apenas copiar os links simbólicos para um subdiretório), então é mais fácil de seguir. Você também tem que ajustá-lo, já que eu não presumo que seu diretório real seja chamado de blah :)

    
por 24.07.2012 / 10:09
0

Acho que você deve usar o caminho completo em vez do caminho relativo como

fx -> /full/path/to/x

Então, quando você copiar o link, ele sempre mostrará x.

    
por 24.07.2012 / 10:26