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