Linux / Comando ln: criar links físicos e simbólicos

ln cria um link físico, outro nome para o mesmo arquivo, por padrão; com -s, cria um link simbólico que guarda um caminho. Use o link físico para compartilhar o mesmo arquivo no mesmo sistema de arquivos, e o simbólico para apontar para uma pasta, outro sistema de arquivos ou um caminho ainda inexistente. A ordem básica é alvo primeiro, nome do link depois.

Os exemplos usam Bash e GNU Coreutils. Confira ln --version, ln --help e man ln no destino; opções como -r e -T podem faltar em outras implementações. Prepare a área exclusiva abaixo e mantenha o mesmo terminal durante a prática. Não é necessário alterar uma instalação real em /opt ou /srv.

O que é o comando ln?

No Linux, inode é a estrutura que identifica um arquivo e seus metadados dentro de um sistema de arquivos. Dois links físicos (hard links) compartilham esse inode; nenhum dos nomes é mais original que o outro. Apagar um nome não destrói os dados enquanto outro link físico permanece. Já o link simbólico, ou symlink, é um objeto separado que guarda texto: se esse caminho deixar de resolver, o link fica pendente, também chamado de quebrado. O manual Linux de links simbólicos descreve essas diferenças.

Sintaxe básica

ln [opções] [-T] alvo nome-do-link
ln [opções] alvo ... diretório

alvo, nome-do-link e diretório são marcadores. Use aspas em caminhos com espaços e -- antes dos nomes no GNU. Normalmente, o nome novo não deve existir; sem uma opção de substituição, ln falha ao encontrar esse nome. Com vários alvos, a pasta receptora precisa existir.

Uso básico do ln

Criar um link físico

Execute o bloco inteiro: ele guarda a pasta inicial, cria uma área exclusiva, prepara os arquivos e gera o link físico. Os passos com && só continuam após sucesso; pare se a preparação falhar. No resultado de stat, as duas linhas devem ter o mesmo identificador de dispositivo (%d) e inode (%i), e a contagem de links (%h) será 2 nessa área nova. %n mostra o nome consultado.

ln_start=$PWD
ln_demo=$(mktemp -d "${TMPDIR:-/tmp}/ln-demo.XXXXXX") &&
cd -- "$ln_demo" &&
mkdir -p -- releases/v1 releases/v2 app links links-t &&
printf '%s\n' 'conteúdo original' > original.txt &&
printf '%s\n' 'arquivo 1' > file1 &&
printf '%s\n' 'arquivo 2' > file2 &&
printf '%s\n' 'versão 1' > releases/v1/version.txt &&
printf '%s\n' 'versão 2' > releases/v2/version.txt &&
ln -s -- releases/v1 current &&
ln -- original.txt hard-link.txt &&
stat -c '%d %i %h %n' -- original.txt hard-link.txt

Uma gravação no arquivo aberto por qualquer desses nomes altera os mesmos bytes. Por exemplo, na prática, printf '%s\n' 'linha adicional' >> hard-link.txt também aparece ao ler original.txt. Um editor que salva substituindo o arquivo por outro inode pode separar essa relação; não confunda isso com uma cópia independente.

Criar um link simbólico

A pasta releases/v1 já existe na área preparada. O primeiro argumento abaixo é um caminho absoluto calculado a partir de ln_demo; esse texto fica guardado em app-current. Um link simbólico também pode ser criado antes de seu alvo existir, mas isso não significa que ele já possa ser aberto.

ln -s -- "$ln_demo/releases/v1" app-current &&
readlink -- app-current

Criar vários links em uma pasta

As duas linhas usam pastas diferentes, links e links-t, para não disputar os mesmos nomes. Cada uma terá file1 e file2 como links. Os textos ../file1 e ../file2 são relativos à pasta de cada link, apontando para os arquivos na raiz da prática. Eles não são avaliados a partir do terminal para decidir o conteúdo do link.

ln -s -- ../file1 ../file2 links/
ln -s -t links-t -- ../file1 ../file2

Ler o caminho guardado no link

Uma criação bem-sucedida normalmente é silenciosa. O comando readlink mostra o texto guardado, sem comprovar que o destino existe. Este exemplo usa um arquivo novo para não sobrescrever original.txt, que já tem um link físico:

printf 'demo\n' > demo-target.txt &&
ln -s -- demo-target.txt shortcut.txt &&
readlink -- shortcut.txt

A saída esperada é demo-target.txt. A pasta que contém shortcut.txt é a base desse caminho relativo. Mover só o link para outra pasta pode quebrá-lo; mover a árvore inteira mantendo a relação entre alvo e link pode preservar seu funcionamento. Para exigir resolução completa de um destino existente, use readlink -e e confira o status.

Opções principais

Opção Propósito
-s Criar links simbólicos em vez de links físicos.
-r Calcular um alvo relativo à localização do link; usar com -s.
-f Substituir um destino existente, que também pode ser um arquivo regular.
-i Pedir confirmação antes de substituir um destino existente.
-n Tratar o último operando que é link para uma pasta como o próprio link.
-T Usar o último argumento como nome exato, sem colocar outro link dentro de uma pasta.
-b Guardar uma versão do destino que seria substituído.
-v Mostrar o nome de cada link depois de criá-lo com sucesso.

-n no ln não significa “não sobrescrever”, como em alguns outros comandos: ele altera o tratamento de um link de destino que aponta para uma pasta. -T é mais forte e torna -n redundante quando ambos aparecem. Sem essas opções, um destino que é link para pasta pode receber um novo link dentro da pasta apontada. -T não autoriza substituir uma pasta real. Essas regras estão no manual GNU de ln.

Exemplos práticos

Criar um link simbólico relativo

Na primeira linha, o texto ../releases/v1 é calculado a partir de app, a pasta que contém app/current. Na segunda, ln -sr calcula o caminho para outro nome, app/current-auto, sem reutilizar o link anterior. O GNU calcula esse caminho a partir dos diretórios e alvos canonicalizados, resolvendo links intermediários; o resultado pode apontar para a localização física resolvida, em vez de preservar um nome intermediário que você pretendia acompanhar.

ln -s -- ../releases/v1 app/current
ln -sr -- "$ln_demo/releases/v1" "$ln_demo/app/current-auto"

Trocar somente um link existente

-f também pode descartar um arquivo regular no nome do destino. Para a prática, salve o script completo abaixo como switch-link.sh e execute bash switch-link.sh "$ln_demo/releases/v2" "$ln_demo/current". Ele requer Bash e GNU ln e readlink, exige que o alvo seja uma pasta acessível e que o caminho a substituir já seja um link simbólico. A preparação criou current apontando para releases/v1.

#!/usr/bin/env bash
if [ "$#" -ne 2 ]; then
  printf '%s\n' 'Uso: bash switch-link.sh PASTA_ALVO LINK_EXISTENTE' >&2
  exit 2
fi
target_dir=$1
link_name=$2
if [ ! -d "$target_dir" ] || [ ! -L "$link_name" ]; then
  printf '%s\n' 'Exige uma pasta alvo e um link simbólico existente.' >&2
  exit 1
fi
printf '%s\n' 'Antes:'
readlink -- "$link_name" || exit 1
ln -sfrT -- "$target_dir" "$link_name" || exit 1
if ! test "$link_name" -ef "$target_dir"; then
  printf '%s\n' 'O link não resolveu para a pasta esperada.' >&2
  exit 1
fi
printf '%s\n' 'Depois:'
readlink -- "$link_name" || exit 1

O script mostra o texto anterior e o novo, usa -r para calcular o alvo relativo e -T para nomear o link exato. Na área preparada, a nova saída será releases/v2; ao ler current/version.txt, você verá versão 2. Uso incorreto retorna 2; falha ou recusa de tipo retorna 1. test -ef verifica se os dois caminhos resolvem para o mesmo arquivo. As verificações não bloqueiam alterações concorrentes: use uma pasta sob seu controle. Trocar o link não torna toda a implantação de uma aplicação uma transação nem valida o serviço.

Inspecionar o link e o destino

O exemplo abaixo inspeciona app-current, que continua apontando para a versão 1, independentemente da troca de current. ls -ld mostra a entrada do link; readlink mostra seu texto e readlink -e exige o caminho final existente. Por padrão, o GNU stat informa sobre o próprio link; com -L, informa sobre o alvo. Os campos %F e %N mostram tipo e nome, com representação de link conforme o caso. Veja também o guia de stat.

ls -ld -- app-current
readlink -- app-current
readlink -e -- app-current
stat -c '%F %N' -- app-current
stat -L -c '%F %N' -- app-current

Comparar links e alternativas

Comando ou método Função principal Quando usar
Link físico (hard link) Outro nome para um inode Compartilhar um arquivo regular no mesmo sistema de arquivos
Link simbólico Um arquivo separado armazenando um caminho de destino Apontar para pastas, outros sistemas de arquivos ou caminhos de versão
cp Uma cópia de dados independente Mudar os dados da cópia sem alterar o original
Montagem vinculada Expor um caminho em outro ponto de montagem Expor um caminho por outra montagem no Linux; exige configuração e permissões próprias

Um link físico não é um backup independente: escrever pelos dois nomes modifica o mesmo arquivo. Se o objetivo for manter versões de conteúdo separadas, use uma cópia com cp. Uma montagem vinculada (bind mount) é outro mecanismo, que expõe uma árvore em outro ponto de montagem; não é um link simbólico criado por ln -s.

Cuidados importantes

Lembre-se da ordem dos operandos

A forma comum é ln alvo nome-do-link. O primeiro caminho indica o arquivo compartilhado, no link físico, ou o texto a guardar, no simbólico. O segundo indica onde criar o nome. Confira ambos antes de acrescentar -f; sem substituição explícita, um nome existente é motivo para examinar o erro, não para forçar automaticamente.

Alvos relativos são baseados na localização do link

Um texto relativo que funciona a partir do terminal pode apontar para outro lugar quando guardado em um link dentro de outra pasta. Calcule-o a partir da pasta que conterá o link, ou use ln -sr sabendo que ele resolve caminhos intermediários. Um link absoluto mantém seu texto ao ser movido, mas pode apontar para outro objeto se o mesmo caminho absoluto tiver significado diferente em outra máquina ou raiz de arquivos.

Links físicos ficam no mesmo sistema de arquivos

No Linux, links físicos compartilham o inode no mesmo sistema de arquivos e não podem atravessar essa fronteira. Não tente criar um link físico de diretório para simular uma árvore: essa operação é normalmente proibida. Links simbólicos podem atravessar sistemas de arquivos, mas o acesso ao destino continua dependendo das permissões de seus componentes. Para voltar à pasta inicial ao fim da prática, use cd -- "$ln_start"; os arquivos de teste permanecem disponíveis.

Perguntas frequentes

O comando ln cria um link simbólico por padrão?

Não. Ele cria um link físico, a menos que -s seja usado.

Excluir o nome original destrói um arquivo com link físico?

Não. Os dados permanecem enquanto outro link físico se refere ao inode.

Como detectar um link simbólico quebrado?

readlink lê o texto mesmo quando o destino não existe. test -L caminho identifica um link, enquanto test -e caminho testa a existência seguindo o destino. Um link com -L verdadeiro e -e falso não resolveu para um objeto acessível: o alvo pode faltar, mas permissões ou um ciclo também podem causar falha. Confira os diagnósticos de readlink -ev antes de concluir que houve exclusão.

Um link simbólico deve usar um destino absoluto ou relativo?

Links relativos são adequados para árvores de diretórios móveis; links absolutos são adequados para caminhos de sistema fixos. Escolha com base em como o link e o destino irão se mover.

Documentação oficial