Como posso editar links simbólicos?

61

Meu entendimento básico de um symlink é como um arquivo especial, um arquivo que contém um caminho de string para outro arquivo. O VFS do kernel abstrai muito disso, mas existe alguma razão pela qual os links simbólicos parecem ser impossíveis de editar?

Em outras palavras: Posso editar um link simbólico? Se não, por que não?

Eu entendo que existem várias maneiras de substituir links simbólicos (duas alternativas estão atualmente na seção de respostas), mas seria interessante obter uma explicação sobre por que a substituição parece ser a única maneira de lidar com links simbólicos. Por que você não pode simplesmente mudar para onde eles apontam?

    
por Oli 30.08.2013 / 10:07

4 respostas

34

Dado que -f apenas faz uma substituição silenciosa, você pode fazer uma substituição atômica com mv -T (-T faz funcionar mesmo que /loc.../link seja um diretório) :

ln -s /location/to/link linkname
# ... 
ln -s /location/to/link2 newlink
mv -T newlink linkname

linkname está acessível durante todo o processo.

    
por 30.08.2013 / 10:19
21

Se por edição, você quer mudar o arquivo para o qual ele aponta, então sim você pode:

$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link 'test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile

O parâmetro -f ( --force ), quando passado para o ln, faz com que ele chame a chamada do sistema unlink() antes de symlink()

Extraído da seguinte pilha resposta de estouro .

    
por 30.08.2013 / 10:10
7

Links simbólicos precisam ser modificados atomicamente. Se você está na metade escrevendo, eles não vão funcionar. O conteúdo de um link simbólico é bem pequeno (no máximo 4095 caracteres no Linux: o comprimento máximo de um caminho para um arquivo), então não haveria muito sentido em editar parte de um link simbólico no nível do kernel. Portanto, o kernel não oferece nenhuma interface para editar um link simbólico, apenas uma interface para criar um novo, a chamada de sistema symlink (mais a interface genérica unlink para remover qualquer arquivo).

A chamada do sistema symlink cria apenas um novo link simbólico, ele não remove nenhum arquivo existente. Isso é chato, mas consistente com outras chamadas do sistema para criar arquivos como open (que pode criar um novo arquivo ou truncar um arquivo existente, mas não substituir um arquivo existente por um arquivo recém-criado) e mkdir . / p>

No shell, como você descobriu , embora não seja possível substituir um link simbólico atomicamente pelo comando ln ( ln -sf desvincula o arquivo anterior e cria o link simbólico), você pode criar primeiro um link simbólico em um nome temporário e movê-lo no lugar.

tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"
    
por 08.09.2013 / 04:21
0

Tecnicamente, não há comando interno para editar um link simbólico existente. Pode ser facilmente alcançado com alguns comandos curtos.

Aqui está uma pequena função bash / zsh que escrevi para atualizar um link simbólico existente:

# -----------------------------------------
# Edit an existing symbolic link
#
# @1 = Name of symbolic link to edit
# @2 = Full destination path to update existing symlink with 
# -----------------------------------------
function edit-symlink () {
    if [ -z "$1" ]; then
        echo "Name of symbolic link you would like to edit:"
        read LINK
    else
        LINK="$1"
    fi
    LINKTMP="$LINK-tmp"
    if [ -z "$2" ]; then
        echo "Full destination path to update existing symlink with:"
        read DEST
    else
        DEST="$2"
    fi
    ln -s $DEST $LINKTMP
    rm $LINK
    mv $LINKTMP $LINK
    printf "Updated $LINK to point to new destination -> $DEST"
}
    
por 26.11.2017 / 23:22