Como copiar links simbólicos enquanto preserva a validade do link?

1

Diga no diretório /usr/local/boost_1_52_0/stage/lib , eu tenho um link simbólico: libboost_timer.so , que aponta para o arquivo normal libboost_timer.so.1.52.0 no mesmo diretório.

Como posso cp os links simbólicos para o diretório /usr/local/lib ao apontar para o mesmo arquivo /usr/local/boost_1_52_0/stage/lib/libboost_timer.so.1.52.0 .

Eu pesquisei e experimentei várias opções. Primeiro, copia o arquivo regular para o diretório de destino usando o nome do link. O segundo apenas copia o link em si, mas o link não é válido no novo diretório. A terceira pessoa cria novos pontos de ligação para o link original, portanto, seria desreferenciada duas vezes para obter o arquivo regular. E eu quero usar o nome do arquivo de link, portanto, fazer diretamente os links do arquivo normal não funcionaria.

Como posso fazer isso?

    
por WiSaGaN 17.01.2013 / 09:02

1 resposta

2

A melhor maneira é desreferenciar duas vezes, mas eu acho que o fato de você ter mencionado isso em sua pergunta implica que isso não é bom para o seu caso de uso (por quê?).

A segunda melhor opção que você tem em um shell padrão bash é usar readlink -f (note, isso irá quebrar se o nome do arquivo contiver novas linhas à direita, o que é extremamente improvável, mas possível).

#!/bin/bash
src="$1"
dest="$2"


fileLinkedTo=$(readlink -f "$src")
if [[ -d "$dest" ]]; then
    ln -s "$fileLinkedTo" "${dest%/}/${src##*/}"
else
    ln -s "$fileLinkedTo" "$dest"
fi

E, em seguida, execute-o como:

./script /usr/local/boost_1_52_0/stage/lib/libboost_timer.so /usr/local/lib
    
por 17.01.2013 / 09:16

Tags